Skip to content

Merge Analytical FIFO sizing PR from upstream#161

Open
fpjentzsch wants to merge 44 commits intodevfrom
merge/fifo_heuristic
Open

Merge Analytical FIFO sizing PR from upstream#161
fpjentzsch wants to merge 44 commits intodevfrom
merge/fifo_heuristic

Conversation

@fpjentzsch
Copy link
Copy Markdown

Attempt to merge Xilinx#1185 before it is merged into the upstream dev branch.

@github-actions
Copy link
Copy Markdown

github-actions bot commented Feb 4, 2026

📋 Docstring Check Report

Checked files:

  • src/finn/analysis/fpgadataflow/dataflow_performance.py
  • src/finn/builder/build_dataflow_config.py
  • src/finn/builder/build_dataflow_steps.py
  • src/finn/custom_op/fpgadataflow/addstreams.py
  • src/finn/custom_op/fpgadataflow/channelwise_op.py
  • src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py
  • src/finn/custom_op/fpgadataflow/duplicatestreams.py
  • src/finn/custom_op/fpgadataflow/fmpadding.py
  • src/finn/custom_op/fpgadataflow/hwcustomop.py
  • src/finn/custom_op/fpgadataflow/labelselect.py
  • src/finn/custom_op/fpgadataflow/matrixvectoractivation.py
  • src/finn/custom_op/fpgadataflow/pool.py
  • src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py
  • src/finn/custom_op/fpgadataflow/thresholding.py
  • src/finn/custom_op/fpgadataflow/vectorvectoractivation.py
  • src/finn/transformation/fpgadataflow/derive_characteristic.py
  • src/finn/util/basic.py
  • tests/fpgadataflow/test_convert_to_hw_pool_batch.py
  • tests/fpgadataflow/test_fifosizing.py
  • tests/fpgadataflow/test_fpgadataflow_channelwise_ops.py
  • tests/fpgadataflow/test_fpgadataflow_convinputgenerator.py
  • tests/fpgadataflow/test_fpgadataflow_downsampler.py
  • tests/fpgadataflow/test_fpgadataflow_dwc.py
  • tests/fpgadataflow/test_fpgadataflow_fmpadding.py
  • tests/fpgadataflow/test_fpgadataflow_labelselect.py
  • tests/fpgadataflow/test_fpgadataflow_mvau.py
  • tests/fpgadataflow/test_fpgadataflow_thresholding.py
  • tests/fpgadataflow/test_fpgadataflow_vvau.py
  • tests/testing_util/test.py

Docstring check failed!

Missing Docstrings Details:

  • src/finn/analysis/fpgadataflow/dataflow_performance.py
  • src/finn/builder/build_dataflow_config.py
  • src/finn/builder/build_dataflow_steps.py
  • src/finn/custom_op/fpgadataflow/addstreams.py
  • src/finn/custom_op/fpgadataflow/channelwise_op.py
  • src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py
  • src/finn/custom_op/fpgadataflow/duplicatestreams.py
  • src/finn/custom_op/fpgadataflow/fmpadding.py
  • src/finn/custom_op/fpgadataflow/hwcustomop.py
  • src/finn/custom_op/fpgadataflow/labelselect.py
  • src/finn/custom_op/fpgadataflow/matrixvectoractivation.py
  • src/finn/custom_op/fpgadataflow/pool.py
  • src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py
  • src/finn/custom_op/fpgadataflow/thresholding.py
  • src/finn/custom_op/fpgadataflow/vectorvectoractivation.py
  • src/finn/transformation/fpgadataflow/derive_characteristic.py
  • src/finn/util/basic.py

📄 src/finn/analysis/fpgadataflow/dataflow_performance.py:

    • Line 1: module 'dataflow_performance.py'

📄 src/finn/custom_op/fpgadataflow/addstreams.py:

    • Line 1: module 'addstreams.py'
    • Line 41: function 'AddStreams.init'
    • Line 44: function 'AddStreams.get_nodeattr_types'
    • Line 62: function 'AddStreams.get_normal_input_shape'
    • Line 68: function 'AddStreams.get_folded_input_shape'
    • Line 76: function 'AddStreams.get_normal_output_shape'
    • Line 79: function 'AddStreams.get_folded_output_shape'
    • Line 82: function 'AddStreams.infer_node_datatype'
    • Line 137: function 'AddStreams.get_exp_cycles'
    • Line 141: function 'AddStreams.execute_node'
    • Line 153: function 'AddStreams.prepare_tree_model'
    • Line 161: function 'AddStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/channelwise_op.py:

    • Line 1: module 'channelwise_op.py'
    • Line 80: function 'ChannelwiseOp.init'
    • Line 83: function 'ChannelwiseOp.get_nodeattr_types'
    • Line 112: function 'ChannelwiseOp.infer_node_datatype'
    • Line 162: function 'ChannelwiseOp.get_instream_width'
    • Line 172: function 'ChannelwiseOp.get_outstream_width'
    • Line 176: function 'ChannelwiseOp.get_folded_input_shape'
    • Line 189: function 'ChannelwiseOp.get_folded_output_shape'
    • Line 193: function 'ChannelwiseOp.get_normal_input_shape'
    • Line 206: function 'ChannelwiseOp.get_normal_output_shape'
    • Line 210: function 'ChannelwiseOp.get_exp_cycles'
    • Line 214: function 'ChannelwiseOp.execute_node'
    • Line 245: function 'ChannelwiseOp.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py:

    • Line 1: module 'convolutioninputgenerator.py'
    • Line 50: function 'ConvolutionInputGenerator.init'
    • Line 53: function 'ConvolutionInputGenerator.get_nodeattr_types'
    • Line 88: function 'ConvolutionInputGenerator.get_normal_input_shape'
    • Line 94: function 'ConvolutionInputGenerator.get_folded_input_shape'
    • Line 103: function 'ConvolutionInputGenerator.get_normal_output_shape'
    • Line 115: function 'ConvolutionInputGenerator.get_folded_output_shape'
    • Line 134: function 'ConvolutionInputGenerator.infer_node_datatype'
    • Line 179: function 'ConvolutionInputGenerator.get_outstream_width'
    • Line 188: function 'ConvolutionInputGenerator.get_1d_conv_attrs_normalized'
    • Line 214: function 'ConvolutionInputGenerator.get_exp_cycles'
    • Line 217: function 'ConvolutionInputGenerator.bram_estimation'
    • Line 220: function 'ConvolutionInputGenerator.lut_estimation'
    • Line 223: function 'ConvolutionInputGenerator.uram_estimation'
    • Line 226: function 'ConvolutionInputGenerator.execute_node'
    • Line 265: function 'ConvolutionInputGenerator.get_tree_model_uniform_distribution_based'
    • Line 266: function 'ConvolutionInputGenerator.distribute_outputs_uniform'
    • Line 563: function 'ConvolutionInputGenerator.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/duplicatestreams.py:

    • Line 1: module 'duplicatestreams.py'
    • Line 40: function 'DuplicateStreams.init'
    • Line 43: function 'DuplicateStreams.get_nodeattr_types'
    • Line 60: function 'DuplicateStreams.get_num_output_streams'
    • Line 63: function 'DuplicateStreams.get_normal_input_shape'
    • Line 69: function 'DuplicateStreams.get_folded_input_shape'
    • Line 78: function 'DuplicateStreams.get_normal_output_shape'
    • Line 83: function 'DuplicateStreams.get_folded_output_shape'
    • Line 88: function 'DuplicateStreams.make_shape_compatible_op'
    • Line 93: function 'DuplicateStreams.infer_node_datatype'
    • Line 130: function 'DuplicateStreams.get_number_output_values'
    • Line 136: function 'DuplicateStreams.get_exp_cycles'
    • Line 140: function 'DuplicateStreams.execute_node'
    • Line 152: function 'DuplicateStreams.get_tree_model'
    • Line 162: function 'DuplicateStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/fmpadding.py:

    • Line 1: module 'fmpadding.py'
    • Line 41: function 'FMPadding.init'
    • Line 44: function 'FMPadding.get_nodeattr_types'
    • Line 76: function 'FMPadding.get_exp_cycles'
    • Line 84: function 'FMPadding.get_normal_input_shape'
    • Line 90: function 'FMPadding.get_normal_output_shape'
    • Line 97: function 'FMPadding.get_folded_input_shape'
    • Line 106: function 'FMPadding.get_folded_output_shape'
    • Line 115: function 'FMPadding.make_shape_compatible_op'
    • Line 122: function 'FMPadding.infer_node_datatype'
    • Line 135: function 'FMPadding.verify_node'
    • Line 150: function 'FMPadding.get_instream_width'
    • Line 155: function 'FMPadding.get_outstream_width'
    • Line 160: function 'FMPadding.get_number_output_values'
    • Line 164: function 'FMPadding.execute_node'
    • Line 175: function 'FMPadding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/hwcustomop.py:

    • Line 1: module 'hwcustomop.py'
    • Line 47: function 'HWCustomOp.init'
    • Line 51: function 'HWCustomOp.get_nodeattr_types'
    • Line 102: function 'HWCustomOp.make_shape_compatible_op'
    • Line 321: function 'HWCustomOp.derive_token_access_vectors'
    • Line 347: function 'HWCustomOp.derive_token_access_vectors_using_tree_model'
    • Line 514: function 'HWCustomOp.generate_hdl_dynload'
    • Line 615: function 'HWCustomOp.accumulate_char_fxn'

📄 src/finn/custom_op/fpgadataflow/labelselect.py:

    • Line 1: module 'labelselect.py'
    • Line 41: function 'LabelSelect.init'
    • Line 55: function 'LabelSelect.get_nodeattr_types'
    • Line 72: function 'LabelSelect.get_normal_input_shape'
    • Line 78: function 'LabelSelect.get_folded_input_shape'
    • Line 87: function 'LabelSelect.get_normal_output_shape'
    • Line 93: function 'LabelSelect.get_folded_output_shape'
    • Line 99: function 'LabelSelect.make_shape_compatible_op'
    • Line 114: function 'LabelSelect.infer_node_datatype'
    • Line 123: function 'LabelSelect.verify_node'
    • Line 147: function 'LabelSelect.get_number_output_values'
    • Line 150: function 'LabelSelect.execute_node'
    • Line 180: function 'LabelSelect.get_exp_cycles'
    • Line 187: function 'LabelSelect.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/matrixvectoractivation.py:

    • Line 1: module 'matrixvectoractivation.py'
    • Line 58: function 'MVAU.init'
    • Line 61: function 'MVAU.get_nodeattr_types'
    • Line 134: function 'MVAU.execute_node'
    • Line 176: function 'MVAU.verify_node'
    • Line 231: function 'MVAU.infer_node_datatype'
    • Line 265: function 'MVAU.get_instream_width'
    • Line 298: function 'MVAU.get_outstream_width'
    • Line 303: function 'MVAU.get_folded_input_shape'
    • Line 329: function 'MVAU.get_folded_output_shape'
    • Line 337: function 'MVAU.get_normal_input_shape'
    • Line 349: function 'MVAU.get_normal_output_shape'
    • Line 375: function 'MVAU.uram_estimation'
    • Line 437: function 'MVAU.bram_efficiency_estimation'
    • Line 463: function 'MVAU.get_exp_cycles'
    • Line 788: function 'MVAU.generate_params'
    • Line 863: function 'MVAU.get_op_and_param_counts'
    • Line 887: function 'MVAU.get_verilog_top_module_intf_names'
    • Line 913: function 'MVAU.code_generation_ipi'
    • Line 1098: function 'MVAU.get_tree_model'
    • Line 1147: function 'MVAU.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/pool.py:

    • Line 233: function 'Pool.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py:

    • Line 1: module 'streamingdatawidthconverter.py'
    • Line 44: function 'StreamingDataWidthConverter.get_nodeattr_types'
    • Line 65: function 'StreamingDataWidthConverter.get_normal_input_shape'
    • Line 69: function 'StreamingDataWidthConverter.get_normal_output_shape'
    • Line 73: function 'StreamingDataWidthConverter.get_iowidth_lcm'
    • Line 78: function 'StreamingDataWidthConverter.needs_lcm'
    • Line 85: function 'StreamingDataWidthConverter.check_divisible_iowidths'
    • Line 88: function 'StreamingDataWidthConverter.get_folded_input_shape'
    • Line 108: function 'StreamingDataWidthConverter.get_folded_output_shape'
    • Line 129: function 'StreamingDataWidthConverter.get_number_input_values'
    • Line 133: function 'StreamingDataWidthConverter.get_number_output_values'
    • Line 137: function 'StreamingDataWidthConverter.get_instream_width'
    • Line 141: function 'StreamingDataWidthConverter.get_outstream_width'
    • Line 145: function 'StreamingDataWidthConverter.infer_node_datatype'
    • Line 159: function 'StreamingDataWidthConverter.verify_node'
    • Line 176: function 'StreamingDataWidthConverter.execute_node'
    • Line 187: function 'StreamingDataWidthConverter.get_exp_cycles'
    • Line 219: function 'StreamingDataWidthConverter.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/thresholding.py:

    • Line 384: function 'Thresholding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/vectorvectoractivation.py:

    • Line 1067: function 'VVAU.get_tree_model'
    • Line 1122: function 'VVAU.derive_token_access_vectors'

📄 src/finn/transformation/fpgadataflow/derive_characteristic.py:

    • Line 1: module 'derive_characteristic.py'
    • Line 45: class 'JustInTimeSynthesize'
    • Line 46: function 'JustInTimeSynthesize.init'
    • Line 52: function 'JustInTimeSynthesize.apply'
    • Line 146: function 'DeriveTokenAccessVectors.init'
    • Line 166: function 'DeriveTokenAccessVectors.applyNodeLocal'
    • Line 196: function 'DeriveTokenAccessVectors.apply'
    • Line 214: function 'LocalStretchCharacteristicFunctions.init'
    • Line 219: function 'LocalStretchCharacteristicFunctions.applyNodeLocal'
    • Line 311: function 'get_top_producer_period'
    • Line 329: function 'get_top_consumer_period'
    • Line 395: function 'get_nodes_until_converging'
    • Line 406: function 'get_throughput'
    • Line 428: function 'get_parent_throughput'
    • Line 439: function 'get_parent'
    • Line 449: function 'get_consumer'
    • Line 455: function 'get_consumer_throughput'
    • Line 466: function 'get_true_period'
    • Line 473: function 'get_branch_nodes'
    • Line 481: function 'get_branch_volume'
    • Line 524: function 'calculate_peak_volume_delta'
    • Line 581: function 'compute_node_latency_init_periods'
    • Line 588: function 'max_dist'
    • Line 622: function 'get_full_branch_latency'
    • Line 629: function 'assign_extra_fifo_volume'
    • Line 738: function 'HandleBranches.init'
    • Line 743: function 'HandleBranches.apply'
    • Line 770: function 'ProducerDelayCharacteristicFunctions.init'
    • Line 775: function 'ProducerDelayCharacteristicFunctions.applyNodeLocal'
    • Line 845: function 'DelayCharacteristicFunctions.init'
    • Line 850: function 'DelayCharacteristicFunctions.applyNodeLocal'
    • Line 932: function 'inter_token_gaps'
    • Line 951: function 'remove_trailing_duplicates_keep_one'
    • Line 966: function 'remove_leading_duplicates_keep_one'
    • Line 989: function 'DeriveFIFOSizes.init'
    • Line 1017: function 'DeriveFIFOSizes.apply'

📄 src/finn/util/basic.py:

    • Line 410: function 'get_driver_shapes'
    • Line 502: function 'stretch'
    • Line 510: class 'Characteristic_Node'
    • Line 511: function 'Characteristic_Node.init'
    • Line 520: function 'Characteristic_Node.sum'
    • Line 581: function 'compress_numpy_to_string'
    • Line 597: function 'decompress_string_to_numpy'
    • Line 609: function 'compute_total_model_fifo_size'

Total missing docstrings: 184

How to Fix:

Please add docstrings to the missing functions, classes, and modules listed above.

Docstring Guidelines:

  • All modules should have a module-level docstring
  • All public functions and methods should have docstrings
  • All private functions should have docstrings
  • All classes should have docstrings
  • Use triple quotes (""") for docstrings
  • Follow PEP 257 conventions
Raw output from docstring checker
Checking 17 specified Python file(s) (excluding tests folder):
  - src/finn/analysis/fpgadataflow/dataflow_performance.py
  - src/finn/builder/build_dataflow_config.py
  - src/finn/builder/build_dataflow_steps.py
  - src/finn/custom_op/fpgadataflow/addstreams.py
  - src/finn/custom_op/fpgadataflow/channelwise_op.py
  - src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py
  - src/finn/custom_op/fpgadataflow/duplicatestreams.py
  - src/finn/custom_op/fpgadataflow/fmpadding.py
  - src/finn/custom_op/fpgadataflow/hwcustomop.py
  - src/finn/custom_op/fpgadataflow/labelselect.py
  - src/finn/custom_op/fpgadataflow/matrixvectoractivation.py
  - src/finn/custom_op/fpgadataflow/pool.py
  - src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py
  - src/finn/custom_op/fpgadataflow/thresholding.py
  - src/finn/custom_op/fpgadataflow/vectorvectoractivation.py
  - src/finn/transformation/fpgadataflow/derive_characteristic.py
  - src/finn/util/basic.py

❌ Missing docstrings found:

📄 src/finn/analysis/fpgadataflow/dataflow_performance.py:
  - Line 1: module 'dataflow_performance.py'

📄 src/finn/custom_op/fpgadataflow/addstreams.py:
  - Line 1: module 'addstreams.py'
  - Line 41: function 'AddStreams.__init__'
  - Line 44: function 'AddStreams.get_nodeattr_types'
  - Line 62: function 'AddStreams.get_normal_input_shape'
  - Line 68: function 'AddStreams.get_folded_input_shape'
  - Line 76: function 'AddStreams.get_normal_output_shape'
  - Line 79: function 'AddStreams.get_folded_output_shape'
  - Line 82: function 'AddStreams.infer_node_datatype'
  - Line 137: function 'AddStreams.get_exp_cycles'
  - Line 141: function 'AddStreams.execute_node'
  - Line 153: function 'AddStreams.prepare_tree_model'
  - Line 161: function 'AddStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/channelwise_op.py:
  - Line 1: module 'channelwise_op.py'
  - Line 80: function 'ChannelwiseOp.__init__'
  - Line 83: function 'ChannelwiseOp.get_nodeattr_types'
  - Line 112: function 'ChannelwiseOp.infer_node_datatype'
  - Line 162: function 'ChannelwiseOp.get_instream_width'
  - Line 172: function 'ChannelwiseOp.get_outstream_width'
  - Line 176: function 'ChannelwiseOp.get_folded_input_shape'
  - Line 189: function 'ChannelwiseOp.get_folded_output_shape'
  - Line 193: function 'ChannelwiseOp.get_normal_input_shape'
  - Line 206: function 'ChannelwiseOp.get_normal_output_shape'
  - Line 210: function 'ChannelwiseOp.get_exp_cycles'
  - Line 214: function 'ChannelwiseOp.execute_node'
  - Line 245: function 'ChannelwiseOp.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py:
  - Line 1: module 'convolutioninputgenerator.py'
  - Line 50: function 'ConvolutionInputGenerator.__init__'
  - Line 53: function 'ConvolutionInputGenerator.get_nodeattr_types'
  - Line 88: function 'ConvolutionInputGenerator.get_normal_input_shape'
  - Line 94: function 'ConvolutionInputGenerator.get_folded_input_shape'
  - Line 103: function 'ConvolutionInputGenerator.get_normal_output_shape'
  - Line 115: function 'ConvolutionInputGenerator.get_folded_output_shape'
  - Line 134: function 'ConvolutionInputGenerator.infer_node_datatype'
  - Line 179: function 'ConvolutionInputGenerator.get_outstream_width'
  - Line 188: function 'ConvolutionInputGenerator.get_1d_conv_attrs_normalized'
  - Line 214: function 'ConvolutionInputGenerator.get_exp_cycles'
  - Line 217: function 'ConvolutionInputGenerator.bram_estimation'
  - Line 220: function 'ConvolutionInputGenerator.lut_estimation'
  - Line 223: function 'ConvolutionInputGenerator.uram_estimation'
  - Line 226: function 'ConvolutionInputGenerator.execute_node'
  - Line 265: function 'ConvolutionInputGenerator.get_tree_model_uniform_distribution_based'
  - Line 266: function 'ConvolutionInputGenerator.distribute_outputs_uniform'
  - Line 563: function 'ConvolutionInputGenerator.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/duplicatestreams.py:
  - Line 1: module 'duplicatestreams.py'
  - Line 40: function 'DuplicateStreams.__init__'
  - Line 43: function 'DuplicateStreams.get_nodeattr_types'
  - Line 60: function 'DuplicateStreams.get_num_output_streams'
  - Line 63: function 'DuplicateStreams.get_normal_input_shape'
  - Line 69: function 'DuplicateStreams.get_folded_input_shape'
  - Line 78: function 'DuplicateStreams.get_normal_output_shape'
  - Line 83: function 'DuplicateStreams.get_folded_output_shape'
  - Line 88: function 'DuplicateStreams.make_shape_compatible_op'
  - Line 93: function 'DuplicateStreams.infer_node_datatype'
  - Line 130: function 'DuplicateStreams.get_number_output_values'
  - Line 136: function 'DuplicateStreams.get_exp_cycles'
  - Line 140: function 'DuplicateStreams.execute_node'
  - Line 152: function 'DuplicateStreams.get_tree_model'
  - Line 162: function 'DuplicateStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/fmpadding.py:
  - Line 1: module 'fmpadding.py'
  - Line 41: function 'FMPadding.__init__'
  - Line 44: function 'FMPadding.get_nodeattr_types'
  - Line 76: function 'FMPadding.get_exp_cycles'
  - Line 84: function 'FMPadding.get_normal_input_shape'
  - Line 90: function 'FMPadding.get_normal_output_shape'
  - Line 97: function 'FMPadding.get_folded_input_shape'
  - Line 106: function 'FMPadding.get_folded_output_shape'
  - Line 115: function 'FMPadding.make_shape_compatible_op'
  - Line 122: function 'FMPadding.infer_node_datatype'
  - Line 135: function 'FMPadding.verify_node'
  - Line 150: function 'FMPadding.get_instream_width'
  - Line 155: function 'FMPadding.get_outstream_width'
  - Line 160: function 'FMPadding.get_number_output_values'
  - Line 164: function 'FMPadding.execute_node'
  - Line 175: function 'FMPadding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/hwcustomop.py:
  - Line 1: module 'hwcustomop.py'
  - Line 47: function 'HWCustomOp.__init__'
  - Line 51: function 'HWCustomOp.get_nodeattr_types'
  - Line 102: function 'HWCustomOp.make_shape_compatible_op'
  - Line 321: function 'HWCustomOp.derive_token_access_vectors'
  - Line 347: function 'HWCustomOp.derive_token_access_vectors_using_tree_model'
  - Line 514: function 'HWCustomOp.generate_hdl_dynload'
  - Line 615: function 'HWCustomOp.accumulate_char_fxn'

📄 src/finn/custom_op/fpgadataflow/labelselect.py:
  - Line 1: module 'labelselect.py'
  - Line 41: function 'LabelSelect.__init__'
  - Line 55: function 'LabelSelect.get_nodeattr_types'
  - Line 72: function 'LabelSelect.get_normal_input_shape'
  - Line 78: function 'LabelSelect.get_folded_input_shape'
  - Line 87: function 'LabelSelect.get_normal_output_shape'
  - Line 93: function 'LabelSelect.get_folded_output_shape'
  - Line 99: function 'LabelSelect.make_shape_compatible_op'
  - Line 114: function 'LabelSelect.infer_node_datatype'
  - Line 123: function 'LabelSelect.verify_node'
  - Line 147: function 'LabelSelect.get_number_output_values'
  - Line 150: function 'LabelSelect.execute_node'
  - Line 180: function 'LabelSelect.get_exp_cycles'
  - Line 187: function 'LabelSelect.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/matrixvectoractivation.py:
  - Line 1: module 'matrixvectoractivation.py'
  - Line 58: function 'MVAU.__init__'
  - Line 61: function 'MVAU.get_nodeattr_types'
  - Line 134: function 'MVAU.execute_node'
  - Line 176: function 'MVAU.verify_node'
  - Line 231: function 'MVAU.infer_node_datatype'
  - Line 265: function 'MVAU.get_instream_width'
  - Line 298: function 'MVAU.get_outstream_width'
  - Line 303: function 'MVAU.get_folded_input_shape'
  - Line 329: function 'MVAU.get_folded_output_shape'
  - Line 337: function 'MVAU.get_normal_input_shape'
  - Line 349: function 'MVAU.get_normal_output_shape'
  - Line 375: function 'MVAU.uram_estimation'
  - Line 437: function 'MVAU.bram_efficiency_estimation'
  - Line 463: function 'MVAU.get_exp_cycles'
  - Line 788: function 'MVAU.generate_params'
  - Line 863: function 'MVAU.get_op_and_param_counts'
  - Line 887: function 'MVAU.get_verilog_top_module_intf_names'
  - Line 913: function 'MVAU.code_generation_ipi'
  - Line 1098: function 'MVAU.get_tree_model'
  - Line 1147: function 'MVAU.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/pool.py:
  - Line 233: function 'Pool.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py:
  - Line 1: module 'streamingdatawidthconverter.py'
  - Line 44: function 'StreamingDataWidthConverter.get_nodeattr_types'
  - Line 65: function 'StreamingDataWidthConverter.get_normal_input_shape'
  - Line 69: function 'StreamingDataWidthConverter.get_normal_output_shape'
  - Line 73: function 'StreamingDataWidthConverter.get_iowidth_lcm'
  - Line 78: function 'StreamingDataWidthConverter.needs_lcm'
  - Line 85: function 'StreamingDataWidthConverter.check_divisible_iowidths'
  - Line 88: function 'StreamingDataWidthConverter.get_folded_input_shape'
  - Line 108: function 'StreamingDataWidthConverter.get_folded_output_shape'
  - Line 129: function 'StreamingDataWidthConverter.get_number_input_values'
  - Line 133: function 'StreamingDataWidthConverter.get_number_output_values'
  - Line 137: function 'StreamingDataWidthConverter.get_instream_width'
  - Line 141: function 'StreamingDataWidthConverter.get_outstream_width'
  - Line 145: function 'StreamingDataWidthConverter.infer_node_datatype'
  - Line 159: function 'StreamingDataWidthConverter.verify_node'
  - Line 176: function 'StreamingDataWidthConverter.execute_node'
  - Line 187: function 'StreamingDataWidthConverter.get_exp_cycles'
  - Line 219: function 'StreamingDataWidthConverter.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/thresholding.py:
  - Line 384: function 'Thresholding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/vectorvectoractivation.py:
  - Line 1067: function 'VVAU.get_tree_model'
  - Line 1122: function 'VVAU.derive_token_access_vectors'

📄 src/finn/transformation/fpgadataflow/derive_characteristic.py:
  - Line 1: module 'derive_characteristic.py'
  - Line 45: class 'JustInTimeSynthesize'
  - Line 46: function 'JustInTimeSynthesize.__init__'
  - Line 52: function 'JustInTimeSynthesize.apply'
  - Line 146: function 'DeriveTokenAccessVectors.__init__'
  - Line 166: function 'DeriveTokenAccessVectors.applyNodeLocal'
  - Line 196: function 'DeriveTokenAccessVectors.apply'
  - Line 214: function 'LocalStretchCharacteristicFunctions.__init__'
  - Line 219: function 'LocalStretchCharacteristicFunctions.applyNodeLocal'
  - Line 311: function 'get_top_producer_period'
  - Line 329: function 'get_top_consumer_period'
  - Line 395: function 'get_nodes_until_converging'
  - Line 406: function 'get_throughput'
  - Line 428: function 'get_parent_throughput'
  - Line 439: function 'get_parent'
  - Line 449: function 'get_consumer'
  - Line 455: function 'get_consumer_throughput'
  - Line 466: function 'get_true_period'
  - Line 473: function 'get_branch_nodes'
  - Line 481: function 'get_branch_volume'
  - Line 524: function 'calculate_peak_volume_delta'
  - Line 581: function 'compute_node_latency_init_periods'
  - Line 588: function 'max_dist'
  - Line 622: function 'get_full_branch_latency'
  - Line 629: function 'assign_extra_fifo_volume'
  - Line 738: function 'HandleBranches.__init__'
  - Line 743: function 'HandleBranches.apply'
  - Line 770: function 'ProducerDelayCharacteristicFunctions.__init__'
  - Line 775: function 'ProducerDelayCharacteristicFunctions.applyNodeLocal'
  - Line 845: function 'DelayCharacteristicFunctions.__init__'
  - Line 850: function 'DelayCharacteristicFunctions.applyNodeLocal'
  - Line 932: function 'inter_token_gaps'
  - Line 951: function 'remove_trailing_duplicates_keep_one'
  - Line 966: function 'remove_leading_duplicates_keep_one'
  - Line 989: function 'DeriveFIFOSizes.__init__'
  - Line 1017: function 'DeriveFIFOSizes.apply'

📄 src/finn/util/basic.py:
  - Line 410: function 'get_driver_shapes'
  - Line 502: function 'stretch'
  - Line 510: class 'Characteristic_Node'
  - Line 511: function 'Characteristic_Node.__init__'
  - Line 520: function 'Characteristic_Node.sum'
  - Line 581: function 'compress_numpy_to_string'
  - Line 597: function 'decompress_string_to_numpy'
  - Line 609: function 'compute_total_model_fifo_size'

Total missing docstrings: 184

@github-actions
Copy link
Copy Markdown

github-actions bot commented Feb 4, 2026

📋 Docstring Check Report

Checked files:

  • src/finn/analysis/fpgadataflow/dataflow_performance.py
  • src/finn/builder/build_dataflow_config.py
  • src/finn/builder/build_dataflow_steps.py
  • src/finn/custom_op/fpgadataflow/addstreams.py
  • src/finn/custom_op/fpgadataflow/channelwise_op.py
  • src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py
  • src/finn/custom_op/fpgadataflow/duplicatestreams.py
  • src/finn/custom_op/fpgadataflow/fmpadding.py
  • src/finn/custom_op/fpgadataflow/hwcustomop.py
  • src/finn/custom_op/fpgadataflow/labelselect.py
  • src/finn/custom_op/fpgadataflow/matrixvectoractivation.py
  • src/finn/custom_op/fpgadataflow/pool.py
  • src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py
  • src/finn/custom_op/fpgadataflow/thresholding.py
  • src/finn/custom_op/fpgadataflow/vectorvectoractivation.py
  • src/finn/transformation/fpgadataflow/derive_characteristic.py
  • src/finn/util/basic.py
  • tests/fpgadataflow/test_convert_to_hw_pool_batch.py
  • tests/fpgadataflow/test_fifosizing.py
  • tests/fpgadataflow/test_fpgadataflow_channelwise_ops.py
  • tests/fpgadataflow/test_fpgadataflow_convinputgenerator.py
  • tests/fpgadataflow/test_fpgadataflow_downsampler.py
  • tests/fpgadataflow/test_fpgadataflow_dwc.py
  • tests/fpgadataflow/test_fpgadataflow_fmpadding.py
  • tests/fpgadataflow/test_fpgadataflow_labelselect.py
  • tests/fpgadataflow/test_fpgadataflow_mvau.py
  • tests/fpgadataflow/test_fpgadataflow_thresholding.py
  • tests/fpgadataflow/test_fpgadataflow_vvau.py
  • tests/testing_util/test.py

Docstring check failed!

Missing Docstrings Details:

  • src/finn/analysis/fpgadataflow/dataflow_performance.py
  • src/finn/builder/build_dataflow_config.py
  • src/finn/builder/build_dataflow_steps.py
  • src/finn/custom_op/fpgadataflow/addstreams.py
  • src/finn/custom_op/fpgadataflow/channelwise_op.py
  • src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py
  • src/finn/custom_op/fpgadataflow/duplicatestreams.py
  • src/finn/custom_op/fpgadataflow/fmpadding.py
  • src/finn/custom_op/fpgadataflow/hwcustomop.py
  • src/finn/custom_op/fpgadataflow/labelselect.py
  • src/finn/custom_op/fpgadataflow/matrixvectoractivation.py
  • src/finn/custom_op/fpgadataflow/pool.py
  • src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py
  • src/finn/custom_op/fpgadataflow/thresholding.py
  • src/finn/custom_op/fpgadataflow/vectorvectoractivation.py
  • src/finn/transformation/fpgadataflow/derive_characteristic.py
  • src/finn/util/basic.py

📄 src/finn/analysis/fpgadataflow/dataflow_performance.py:

    • Line 1: module 'dataflow_performance.py'

📄 src/finn/custom_op/fpgadataflow/addstreams.py:

    • Line 1: module 'addstreams.py'
    • Line 41: function 'AddStreams.init'
    • Line 44: function 'AddStreams.get_nodeattr_types'
    • Line 62: function 'AddStreams.get_normal_input_shape'
    • Line 68: function 'AddStreams.get_folded_input_shape'
    • Line 76: function 'AddStreams.get_normal_output_shape'
    • Line 79: function 'AddStreams.get_folded_output_shape'
    • Line 82: function 'AddStreams.infer_node_datatype'
    • Line 137: function 'AddStreams.get_exp_cycles'
    • Line 141: function 'AddStreams.execute_node'
    • Line 153: function 'AddStreams.prepare_tree_model'
    • Line 161: function 'AddStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/channelwise_op.py:

    • Line 1: module 'channelwise_op.py'
    • Line 80: function 'ChannelwiseOp.init'
    • Line 83: function 'ChannelwiseOp.get_nodeattr_types'
    • Line 112: function 'ChannelwiseOp.infer_node_datatype'
    • Line 162: function 'ChannelwiseOp.get_instream_width'
    • Line 172: function 'ChannelwiseOp.get_outstream_width'
    • Line 176: function 'ChannelwiseOp.get_folded_input_shape'
    • Line 189: function 'ChannelwiseOp.get_folded_output_shape'
    • Line 193: function 'ChannelwiseOp.get_normal_input_shape'
    • Line 206: function 'ChannelwiseOp.get_normal_output_shape'
    • Line 210: function 'ChannelwiseOp.get_exp_cycles'
    • Line 214: function 'ChannelwiseOp.execute_node'
    • Line 245: function 'ChannelwiseOp.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py:

    • Line 1: module 'convolutioninputgenerator.py'
    • Line 50: function 'ConvolutionInputGenerator.init'
    • Line 53: function 'ConvolutionInputGenerator.get_nodeattr_types'
    • Line 88: function 'ConvolutionInputGenerator.get_normal_input_shape'
    • Line 94: function 'ConvolutionInputGenerator.get_folded_input_shape'
    • Line 103: function 'ConvolutionInputGenerator.get_normal_output_shape'
    • Line 115: function 'ConvolutionInputGenerator.get_folded_output_shape'
    • Line 134: function 'ConvolutionInputGenerator.infer_node_datatype'
    • Line 179: function 'ConvolutionInputGenerator.get_outstream_width'
    • Line 188: function 'ConvolutionInputGenerator.get_1d_conv_attrs_normalized'
    • Line 214: function 'ConvolutionInputGenerator.get_exp_cycles'
    • Line 217: function 'ConvolutionInputGenerator.bram_estimation'
    • Line 220: function 'ConvolutionInputGenerator.lut_estimation'
    • Line 223: function 'ConvolutionInputGenerator.uram_estimation'
    • Line 226: function 'ConvolutionInputGenerator.execute_node'
    • Line 265: function 'ConvolutionInputGenerator.get_tree_model_uniform_distribution_based'
    • Line 266: function 'ConvolutionInputGenerator.distribute_outputs_uniform'
    • Line 563: function 'ConvolutionInputGenerator.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/duplicatestreams.py:

    • Line 1: module 'duplicatestreams.py'
    • Line 40: function 'DuplicateStreams.init'
    • Line 43: function 'DuplicateStreams.get_nodeattr_types'
    • Line 60: function 'DuplicateStreams.get_num_output_streams'
    • Line 63: function 'DuplicateStreams.get_normal_input_shape'
    • Line 69: function 'DuplicateStreams.get_folded_input_shape'
    • Line 78: function 'DuplicateStreams.get_normal_output_shape'
    • Line 83: function 'DuplicateStreams.get_folded_output_shape'
    • Line 88: function 'DuplicateStreams.make_shape_compatible_op'
    • Line 93: function 'DuplicateStreams.infer_node_datatype'
    • Line 130: function 'DuplicateStreams.get_number_output_values'
    • Line 136: function 'DuplicateStreams.get_exp_cycles'
    • Line 140: function 'DuplicateStreams.execute_node'
    • Line 152: function 'DuplicateStreams.get_tree_model'
    • Line 162: function 'DuplicateStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/fmpadding.py:

    • Line 1: module 'fmpadding.py'
    • Line 41: function 'FMPadding.init'
    • Line 44: function 'FMPadding.get_nodeattr_types'
    • Line 76: function 'FMPadding.get_exp_cycles'
    • Line 84: function 'FMPadding.get_normal_input_shape'
    • Line 90: function 'FMPadding.get_normal_output_shape'
    • Line 97: function 'FMPadding.get_folded_input_shape'
    • Line 106: function 'FMPadding.get_folded_output_shape'
    • Line 115: function 'FMPadding.make_shape_compatible_op'
    • Line 122: function 'FMPadding.infer_node_datatype'
    • Line 135: function 'FMPadding.verify_node'
    • Line 150: function 'FMPadding.get_instream_width'
    • Line 155: function 'FMPadding.get_outstream_width'
    • Line 160: function 'FMPadding.get_number_output_values'
    • Line 164: function 'FMPadding.execute_node'
    • Line 175: function 'FMPadding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/hwcustomop.py:

    • Line 1: module 'hwcustomop.py'
    • Line 47: function 'HWCustomOp.init'
    • Line 51: function 'HWCustomOp.get_nodeattr_types'
    • Line 102: function 'HWCustomOp.make_shape_compatible_op'
    • Line 321: function 'HWCustomOp.derive_token_access_vectors'
    • Line 347: function 'HWCustomOp.derive_token_access_vectors_using_tree_model'
    • Line 514: function 'HWCustomOp.generate_hdl_dynload'
    • Line 615: function 'HWCustomOp.accumulate_char_fxn'

📄 src/finn/custom_op/fpgadataflow/labelselect.py:

    • Line 1: module 'labelselect.py'
    • Line 41: function 'LabelSelect.init'
    • Line 55: function 'LabelSelect.get_nodeattr_types'
    • Line 72: function 'LabelSelect.get_normal_input_shape'
    • Line 78: function 'LabelSelect.get_folded_input_shape'
    • Line 87: function 'LabelSelect.get_normal_output_shape'
    • Line 93: function 'LabelSelect.get_folded_output_shape'
    • Line 99: function 'LabelSelect.make_shape_compatible_op'
    • Line 114: function 'LabelSelect.infer_node_datatype'
    • Line 123: function 'LabelSelect.verify_node'
    • Line 147: function 'LabelSelect.get_number_output_values'
    • Line 150: function 'LabelSelect.execute_node'
    • Line 180: function 'LabelSelect.get_exp_cycles'
    • Line 187: function 'LabelSelect.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/matrixvectoractivation.py:

    • Line 1: module 'matrixvectoractivation.py'
    • Line 58: function 'MVAU.init'
    • Line 61: function 'MVAU.get_nodeattr_types'
    • Line 134: function 'MVAU.execute_node'
    • Line 176: function 'MVAU.verify_node'
    • Line 231: function 'MVAU.infer_node_datatype'
    • Line 265: function 'MVAU.get_instream_width'
    • Line 298: function 'MVAU.get_outstream_width'
    • Line 303: function 'MVAU.get_folded_input_shape'
    • Line 329: function 'MVAU.get_folded_output_shape'
    • Line 337: function 'MVAU.get_normal_input_shape'
    • Line 349: function 'MVAU.get_normal_output_shape'
    • Line 375: function 'MVAU.uram_estimation'
    • Line 437: function 'MVAU.bram_efficiency_estimation'
    • Line 463: function 'MVAU.get_exp_cycles'
    • Line 788: function 'MVAU.generate_params'
    • Line 863: function 'MVAU.get_op_and_param_counts'
    • Line 887: function 'MVAU.get_verilog_top_module_intf_names'
    • Line 913: function 'MVAU.code_generation_ipi'
    • Line 1098: function 'MVAU.get_tree_model'
    • Line 1147: function 'MVAU.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/pool.py:

    • Line 233: function 'Pool.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py:

    • Line 1: module 'streamingdatawidthconverter.py'
    • Line 44: function 'StreamingDataWidthConverter.get_nodeattr_types'
    • Line 65: function 'StreamingDataWidthConverter.get_normal_input_shape'
    • Line 69: function 'StreamingDataWidthConverter.get_normal_output_shape'
    • Line 73: function 'StreamingDataWidthConverter.get_iowidth_lcm'
    • Line 78: function 'StreamingDataWidthConverter.needs_lcm'
    • Line 85: function 'StreamingDataWidthConverter.check_divisible_iowidths'
    • Line 88: function 'StreamingDataWidthConverter.get_folded_input_shape'
    • Line 108: function 'StreamingDataWidthConverter.get_folded_output_shape'
    • Line 129: function 'StreamingDataWidthConverter.get_number_input_values'
    • Line 133: function 'StreamingDataWidthConverter.get_number_output_values'
    • Line 137: function 'StreamingDataWidthConverter.get_instream_width'
    • Line 141: function 'StreamingDataWidthConverter.get_outstream_width'
    • Line 145: function 'StreamingDataWidthConverter.infer_node_datatype'
    • Line 159: function 'StreamingDataWidthConverter.verify_node'
    • Line 176: function 'StreamingDataWidthConverter.execute_node'
    • Line 187: function 'StreamingDataWidthConverter.get_exp_cycles'
    • Line 219: function 'StreamingDataWidthConverter.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/thresholding.py:

    • Line 384: function 'Thresholding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/vectorvectoractivation.py:

    • Line 1067: function 'VVAU.get_tree_model'
    • Line 1122: function 'VVAU.derive_token_access_vectors'

📄 src/finn/transformation/fpgadataflow/derive_characteristic.py:

    • Line 1: module 'derive_characteristic.py'
    • Line 45: class 'JustInTimeSynthesize'
    • Line 46: function 'JustInTimeSynthesize.init'
    • Line 52: function 'JustInTimeSynthesize.apply'
    • Line 146: function 'DeriveTokenAccessVectors.init'
    • Line 166: function 'DeriveTokenAccessVectors.applyNodeLocal'
    • Line 196: function 'DeriveTokenAccessVectors.apply'
    • Line 214: function 'LocalStretchCharacteristicFunctions.init'
    • Line 219: function 'LocalStretchCharacteristicFunctions.applyNodeLocal'
    • Line 311: function 'get_top_producer_period'
    • Line 329: function 'get_top_consumer_period'
    • Line 395: function 'get_nodes_until_converging'
    • Line 406: function 'get_throughput'
    • Line 428: function 'get_parent_throughput'
    • Line 439: function 'get_parent'
    • Line 449: function 'get_consumer'
    • Line 455: function 'get_consumer_throughput'
    • Line 466: function 'get_true_period'
    • Line 473: function 'get_branch_nodes'
    • Line 481: function 'get_branch_volume'
    • Line 524: function 'calculate_peak_volume_delta'
    • Line 581: function 'compute_node_latency_init_periods'
    • Line 588: function 'max_dist'
    • Line 622: function 'get_full_branch_latency'
    • Line 629: function 'assign_extra_fifo_volume'
    • Line 738: function 'HandleBranches.init'
    • Line 743: function 'HandleBranches.apply'
    • Line 770: function 'ProducerDelayCharacteristicFunctions.init'
    • Line 775: function 'ProducerDelayCharacteristicFunctions.applyNodeLocal'
    • Line 845: function 'DelayCharacteristicFunctions.init'
    • Line 850: function 'DelayCharacteristicFunctions.applyNodeLocal'
    • Line 932: function 'inter_token_gaps'
    • Line 951: function 'remove_trailing_duplicates_keep_one'
    • Line 966: function 'remove_leading_duplicates_keep_one'
    • Line 989: function 'DeriveFIFOSizes.init'
    • Line 1017: function 'DeriveFIFOSizes.apply'

📄 src/finn/util/basic.py:

    • Line 410: function 'get_driver_shapes'
    • Line 502: function 'stretch'
    • Line 510: class 'Characteristic_Node'
    • Line 511: function 'Characteristic_Node.init'
    • Line 520: function 'Characteristic_Node.sum'
    • Line 581: function 'compress_numpy_to_string'
    • Line 597: function 'decompress_string_to_numpy'
    • Line 609: function 'compute_total_model_fifo_size'

Total missing docstrings: 184

How to Fix:

Please add docstrings to the missing functions, classes, and modules listed above.

Docstring Guidelines:

  • All modules should have a module-level docstring
  • All public functions and methods should have docstrings
  • All private functions should have docstrings
  • All classes should have docstrings
  • Use triple quotes (""") for docstrings
  • Follow PEP 257 conventions
Raw output from docstring checker
Checking 17 specified Python file(s) (excluding tests folder):
  - src/finn/analysis/fpgadataflow/dataflow_performance.py
  - src/finn/builder/build_dataflow_config.py
  - src/finn/builder/build_dataflow_steps.py
  - src/finn/custom_op/fpgadataflow/addstreams.py
  - src/finn/custom_op/fpgadataflow/channelwise_op.py
  - src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py
  - src/finn/custom_op/fpgadataflow/duplicatestreams.py
  - src/finn/custom_op/fpgadataflow/fmpadding.py
  - src/finn/custom_op/fpgadataflow/hwcustomop.py
  - src/finn/custom_op/fpgadataflow/labelselect.py
  - src/finn/custom_op/fpgadataflow/matrixvectoractivation.py
  - src/finn/custom_op/fpgadataflow/pool.py
  - src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py
  - src/finn/custom_op/fpgadataflow/thresholding.py
  - src/finn/custom_op/fpgadataflow/vectorvectoractivation.py
  - src/finn/transformation/fpgadataflow/derive_characteristic.py
  - src/finn/util/basic.py

❌ Missing docstrings found:

📄 src/finn/analysis/fpgadataflow/dataflow_performance.py:
  - Line 1: module 'dataflow_performance.py'

📄 src/finn/custom_op/fpgadataflow/addstreams.py:
  - Line 1: module 'addstreams.py'
  - Line 41: function 'AddStreams.__init__'
  - Line 44: function 'AddStreams.get_nodeattr_types'
  - Line 62: function 'AddStreams.get_normal_input_shape'
  - Line 68: function 'AddStreams.get_folded_input_shape'
  - Line 76: function 'AddStreams.get_normal_output_shape'
  - Line 79: function 'AddStreams.get_folded_output_shape'
  - Line 82: function 'AddStreams.infer_node_datatype'
  - Line 137: function 'AddStreams.get_exp_cycles'
  - Line 141: function 'AddStreams.execute_node'
  - Line 153: function 'AddStreams.prepare_tree_model'
  - Line 161: function 'AddStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/channelwise_op.py:
  - Line 1: module 'channelwise_op.py'
  - Line 80: function 'ChannelwiseOp.__init__'
  - Line 83: function 'ChannelwiseOp.get_nodeattr_types'
  - Line 112: function 'ChannelwiseOp.infer_node_datatype'
  - Line 162: function 'ChannelwiseOp.get_instream_width'
  - Line 172: function 'ChannelwiseOp.get_outstream_width'
  - Line 176: function 'ChannelwiseOp.get_folded_input_shape'
  - Line 189: function 'ChannelwiseOp.get_folded_output_shape'
  - Line 193: function 'ChannelwiseOp.get_normal_input_shape'
  - Line 206: function 'ChannelwiseOp.get_normal_output_shape'
  - Line 210: function 'ChannelwiseOp.get_exp_cycles'
  - Line 214: function 'ChannelwiseOp.execute_node'
  - Line 245: function 'ChannelwiseOp.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py:
  - Line 1: module 'convolutioninputgenerator.py'
  - Line 50: function 'ConvolutionInputGenerator.__init__'
  - Line 53: function 'ConvolutionInputGenerator.get_nodeattr_types'
  - Line 88: function 'ConvolutionInputGenerator.get_normal_input_shape'
  - Line 94: function 'ConvolutionInputGenerator.get_folded_input_shape'
  - Line 103: function 'ConvolutionInputGenerator.get_normal_output_shape'
  - Line 115: function 'ConvolutionInputGenerator.get_folded_output_shape'
  - Line 134: function 'ConvolutionInputGenerator.infer_node_datatype'
  - Line 179: function 'ConvolutionInputGenerator.get_outstream_width'
  - Line 188: function 'ConvolutionInputGenerator.get_1d_conv_attrs_normalized'
  - Line 214: function 'ConvolutionInputGenerator.get_exp_cycles'
  - Line 217: function 'ConvolutionInputGenerator.bram_estimation'
  - Line 220: function 'ConvolutionInputGenerator.lut_estimation'
  - Line 223: function 'ConvolutionInputGenerator.uram_estimation'
  - Line 226: function 'ConvolutionInputGenerator.execute_node'
  - Line 265: function 'ConvolutionInputGenerator.get_tree_model_uniform_distribution_based'
  - Line 266: function 'ConvolutionInputGenerator.distribute_outputs_uniform'
  - Line 563: function 'ConvolutionInputGenerator.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/duplicatestreams.py:
  - Line 1: module 'duplicatestreams.py'
  - Line 40: function 'DuplicateStreams.__init__'
  - Line 43: function 'DuplicateStreams.get_nodeattr_types'
  - Line 60: function 'DuplicateStreams.get_num_output_streams'
  - Line 63: function 'DuplicateStreams.get_normal_input_shape'
  - Line 69: function 'DuplicateStreams.get_folded_input_shape'
  - Line 78: function 'DuplicateStreams.get_normal_output_shape'
  - Line 83: function 'DuplicateStreams.get_folded_output_shape'
  - Line 88: function 'DuplicateStreams.make_shape_compatible_op'
  - Line 93: function 'DuplicateStreams.infer_node_datatype'
  - Line 130: function 'DuplicateStreams.get_number_output_values'
  - Line 136: function 'DuplicateStreams.get_exp_cycles'
  - Line 140: function 'DuplicateStreams.execute_node'
  - Line 152: function 'DuplicateStreams.get_tree_model'
  - Line 162: function 'DuplicateStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/fmpadding.py:
  - Line 1: module 'fmpadding.py'
  - Line 41: function 'FMPadding.__init__'
  - Line 44: function 'FMPadding.get_nodeattr_types'
  - Line 76: function 'FMPadding.get_exp_cycles'
  - Line 84: function 'FMPadding.get_normal_input_shape'
  - Line 90: function 'FMPadding.get_normal_output_shape'
  - Line 97: function 'FMPadding.get_folded_input_shape'
  - Line 106: function 'FMPadding.get_folded_output_shape'
  - Line 115: function 'FMPadding.make_shape_compatible_op'
  - Line 122: function 'FMPadding.infer_node_datatype'
  - Line 135: function 'FMPadding.verify_node'
  - Line 150: function 'FMPadding.get_instream_width'
  - Line 155: function 'FMPadding.get_outstream_width'
  - Line 160: function 'FMPadding.get_number_output_values'
  - Line 164: function 'FMPadding.execute_node'
  - Line 175: function 'FMPadding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/hwcustomop.py:
  - Line 1: module 'hwcustomop.py'
  - Line 47: function 'HWCustomOp.__init__'
  - Line 51: function 'HWCustomOp.get_nodeattr_types'
  - Line 102: function 'HWCustomOp.make_shape_compatible_op'
  - Line 321: function 'HWCustomOp.derive_token_access_vectors'
  - Line 347: function 'HWCustomOp.derive_token_access_vectors_using_tree_model'
  - Line 514: function 'HWCustomOp.generate_hdl_dynload'
  - Line 615: function 'HWCustomOp.accumulate_char_fxn'

📄 src/finn/custom_op/fpgadataflow/labelselect.py:
  - Line 1: module 'labelselect.py'
  - Line 41: function 'LabelSelect.__init__'
  - Line 55: function 'LabelSelect.get_nodeattr_types'
  - Line 72: function 'LabelSelect.get_normal_input_shape'
  - Line 78: function 'LabelSelect.get_folded_input_shape'
  - Line 87: function 'LabelSelect.get_normal_output_shape'
  - Line 93: function 'LabelSelect.get_folded_output_shape'
  - Line 99: function 'LabelSelect.make_shape_compatible_op'
  - Line 114: function 'LabelSelect.infer_node_datatype'
  - Line 123: function 'LabelSelect.verify_node'
  - Line 147: function 'LabelSelect.get_number_output_values'
  - Line 150: function 'LabelSelect.execute_node'
  - Line 180: function 'LabelSelect.get_exp_cycles'
  - Line 187: function 'LabelSelect.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/matrixvectoractivation.py:
  - Line 1: module 'matrixvectoractivation.py'
  - Line 58: function 'MVAU.__init__'
  - Line 61: function 'MVAU.get_nodeattr_types'
  - Line 134: function 'MVAU.execute_node'
  - Line 176: function 'MVAU.verify_node'
  - Line 231: function 'MVAU.infer_node_datatype'
  - Line 265: function 'MVAU.get_instream_width'
  - Line 298: function 'MVAU.get_outstream_width'
  - Line 303: function 'MVAU.get_folded_input_shape'
  - Line 329: function 'MVAU.get_folded_output_shape'
  - Line 337: function 'MVAU.get_normal_input_shape'
  - Line 349: function 'MVAU.get_normal_output_shape'
  - Line 375: function 'MVAU.uram_estimation'
  - Line 437: function 'MVAU.bram_efficiency_estimation'
  - Line 463: function 'MVAU.get_exp_cycles'
  - Line 788: function 'MVAU.generate_params'
  - Line 863: function 'MVAU.get_op_and_param_counts'
  - Line 887: function 'MVAU.get_verilog_top_module_intf_names'
  - Line 913: function 'MVAU.code_generation_ipi'
  - Line 1098: function 'MVAU.get_tree_model'
  - Line 1147: function 'MVAU.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/pool.py:
  - Line 233: function 'Pool.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py:
  - Line 1: module 'streamingdatawidthconverter.py'
  - Line 44: function 'StreamingDataWidthConverter.get_nodeattr_types'
  - Line 65: function 'StreamingDataWidthConverter.get_normal_input_shape'
  - Line 69: function 'StreamingDataWidthConverter.get_normal_output_shape'
  - Line 73: function 'StreamingDataWidthConverter.get_iowidth_lcm'
  - Line 78: function 'StreamingDataWidthConverter.needs_lcm'
  - Line 85: function 'StreamingDataWidthConverter.check_divisible_iowidths'
  - Line 88: function 'StreamingDataWidthConverter.get_folded_input_shape'
  - Line 108: function 'StreamingDataWidthConverter.get_folded_output_shape'
  - Line 129: function 'StreamingDataWidthConverter.get_number_input_values'
  - Line 133: function 'StreamingDataWidthConverter.get_number_output_values'
  - Line 137: function 'StreamingDataWidthConverter.get_instream_width'
  - Line 141: function 'StreamingDataWidthConverter.get_outstream_width'
  - Line 145: function 'StreamingDataWidthConverter.infer_node_datatype'
  - Line 159: function 'StreamingDataWidthConverter.verify_node'
  - Line 176: function 'StreamingDataWidthConverter.execute_node'
  - Line 187: function 'StreamingDataWidthConverter.get_exp_cycles'
  - Line 219: function 'StreamingDataWidthConverter.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/thresholding.py:
  - Line 384: function 'Thresholding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/vectorvectoractivation.py:
  - Line 1067: function 'VVAU.get_tree_model'
  - Line 1122: function 'VVAU.derive_token_access_vectors'

📄 src/finn/transformation/fpgadataflow/derive_characteristic.py:
  - Line 1: module 'derive_characteristic.py'
  - Line 45: class 'JustInTimeSynthesize'
  - Line 46: function 'JustInTimeSynthesize.__init__'
  - Line 52: function 'JustInTimeSynthesize.apply'
  - Line 146: function 'DeriveTokenAccessVectors.__init__'
  - Line 166: function 'DeriveTokenAccessVectors.applyNodeLocal'
  - Line 196: function 'DeriveTokenAccessVectors.apply'
  - Line 214: function 'LocalStretchCharacteristicFunctions.__init__'
  - Line 219: function 'LocalStretchCharacteristicFunctions.applyNodeLocal'
  - Line 311: function 'get_top_producer_period'
  - Line 329: function 'get_top_consumer_period'
  - Line 395: function 'get_nodes_until_converging'
  - Line 406: function 'get_throughput'
  - Line 428: function 'get_parent_throughput'
  - Line 439: function 'get_parent'
  - Line 449: function 'get_consumer'
  - Line 455: function 'get_consumer_throughput'
  - Line 466: function 'get_true_period'
  - Line 473: function 'get_branch_nodes'
  - Line 481: function 'get_branch_volume'
  - Line 524: function 'calculate_peak_volume_delta'
  - Line 581: function 'compute_node_latency_init_periods'
  - Line 588: function 'max_dist'
  - Line 622: function 'get_full_branch_latency'
  - Line 629: function 'assign_extra_fifo_volume'
  - Line 738: function 'HandleBranches.__init__'
  - Line 743: function 'HandleBranches.apply'
  - Line 770: function 'ProducerDelayCharacteristicFunctions.__init__'
  - Line 775: function 'ProducerDelayCharacteristicFunctions.applyNodeLocal'
  - Line 845: function 'DelayCharacteristicFunctions.__init__'
  - Line 850: function 'DelayCharacteristicFunctions.applyNodeLocal'
  - Line 932: function 'inter_token_gaps'
  - Line 951: function 'remove_trailing_duplicates_keep_one'
  - Line 966: function 'remove_leading_duplicates_keep_one'
  - Line 989: function 'DeriveFIFOSizes.__init__'
  - Line 1017: function 'DeriveFIFOSizes.apply'

📄 src/finn/util/basic.py:
  - Line 410: function 'get_driver_shapes'
  - Line 502: function 'stretch'
  - Line 510: class 'Characteristic_Node'
  - Line 511: function 'Characteristic_Node.__init__'
  - Line 520: function 'Characteristic_Node.sum'
  - Line 581: function 'compress_numpy_to_string'
  - Line 597: function 'decompress_string_to_numpy'
  - Line 609: function 'compute_total_model_fifo_size'

Total missing docstrings: 184

@github-actions
Copy link
Copy Markdown

github-actions bot commented Feb 8, 2026

📋 Docstring Check Report

Checked files:

  • src/finn/analysis/fpgadataflow/dataflow_performance.py
  • src/finn/builder/build_dataflow_config.py
  • src/finn/builder/build_dataflow_steps.py
  • src/finn/custom_op/fpgadataflow/addstreams.py
  • src/finn/custom_op/fpgadataflow/channelwise_op.py
  • src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py
  • src/finn/custom_op/fpgadataflow/duplicatestreams.py
  • src/finn/custom_op/fpgadataflow/fmpadding.py
  • src/finn/custom_op/fpgadataflow/hwcustomop.py
  • src/finn/custom_op/fpgadataflow/labelselect.py
  • src/finn/custom_op/fpgadataflow/matrixvectoractivation.py
  • src/finn/custom_op/fpgadataflow/pool.py
  • src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py
  • src/finn/custom_op/fpgadataflow/thresholding.py
  • src/finn/custom_op/fpgadataflow/vectorvectoractivation.py
  • src/finn/transformation/fpgadataflow/derive_characteristic.py
  • src/finn/util/basic.py
  • tests/fpgadataflow/test_convert_to_hw_pool_batch.py
  • tests/fpgadataflow/test_fifosizing.py
  • tests/fpgadataflow/test_fpgadataflow_channelwise_ops.py
  • tests/fpgadataflow/test_fpgadataflow_convinputgenerator.py
  • tests/fpgadataflow/test_fpgadataflow_downsampler.py
  • tests/fpgadataflow/test_fpgadataflow_dwc.py
  • tests/fpgadataflow/test_fpgadataflow_fmpadding.py
  • tests/fpgadataflow/test_fpgadataflow_labelselect.py
  • tests/fpgadataflow/test_fpgadataflow_mvau.py
  • tests/fpgadataflow/test_fpgadataflow_thresholding.py
  • tests/fpgadataflow/test_fpgadataflow_vvau.py
  • tests/testing_util/test.py

Docstring check failed!

Missing Docstrings Details:

  • src/finn/analysis/fpgadataflow/dataflow_performance.py
  • src/finn/builder/build_dataflow_config.py
  • src/finn/builder/build_dataflow_steps.py
  • src/finn/custom_op/fpgadataflow/addstreams.py
  • src/finn/custom_op/fpgadataflow/channelwise_op.py
  • src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py
  • src/finn/custom_op/fpgadataflow/duplicatestreams.py
  • src/finn/custom_op/fpgadataflow/fmpadding.py
  • src/finn/custom_op/fpgadataflow/hwcustomop.py
  • src/finn/custom_op/fpgadataflow/labelselect.py
  • src/finn/custom_op/fpgadataflow/matrixvectoractivation.py
  • src/finn/custom_op/fpgadataflow/pool.py
  • src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py
  • src/finn/custom_op/fpgadataflow/thresholding.py
  • src/finn/custom_op/fpgadataflow/vectorvectoractivation.py
  • src/finn/transformation/fpgadataflow/derive_characteristic.py
  • src/finn/util/basic.py

📄 src/finn/analysis/fpgadataflow/dataflow_performance.py:

    • Line 1: module 'dataflow_performance.py'

📄 src/finn/custom_op/fpgadataflow/addstreams.py:

    • Line 1: module 'addstreams.py'
    • Line 41: function 'AddStreams.init'
    • Line 44: function 'AddStreams.get_nodeattr_types'
    • Line 62: function 'AddStreams.get_normal_input_shape'
    • Line 68: function 'AddStreams.get_folded_input_shape'
    • Line 76: function 'AddStreams.get_normal_output_shape'
    • Line 79: function 'AddStreams.get_folded_output_shape'
    • Line 82: function 'AddStreams.infer_node_datatype'
    • Line 137: function 'AddStreams.get_exp_cycles'
    • Line 141: function 'AddStreams.execute_node'
    • Line 153: function 'AddStreams.prepare_tree_model'
    • Line 161: function 'AddStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/channelwise_op.py:

    • Line 1: module 'channelwise_op.py'
    • Line 80: function 'ChannelwiseOp.init'
    • Line 83: function 'ChannelwiseOp.get_nodeattr_types'
    • Line 112: function 'ChannelwiseOp.infer_node_datatype'
    • Line 162: function 'ChannelwiseOp.get_instream_width'
    • Line 172: function 'ChannelwiseOp.get_outstream_width'
    • Line 176: function 'ChannelwiseOp.get_folded_input_shape'
    • Line 189: function 'ChannelwiseOp.get_folded_output_shape'
    • Line 193: function 'ChannelwiseOp.get_normal_input_shape'
    • Line 206: function 'ChannelwiseOp.get_normal_output_shape'
    • Line 210: function 'ChannelwiseOp.get_exp_cycles'
    • Line 214: function 'ChannelwiseOp.execute_node'
    • Line 245: function 'ChannelwiseOp.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py:

    • Line 1: module 'convolutioninputgenerator.py'
    • Line 50: function 'ConvolutionInputGenerator.init'
    • Line 53: function 'ConvolutionInputGenerator.get_nodeattr_types'
    • Line 88: function 'ConvolutionInputGenerator.get_normal_input_shape'
    • Line 94: function 'ConvolutionInputGenerator.get_folded_input_shape'
    • Line 103: function 'ConvolutionInputGenerator.get_normal_output_shape'
    • Line 115: function 'ConvolutionInputGenerator.get_folded_output_shape'
    • Line 134: function 'ConvolutionInputGenerator.infer_node_datatype'
    • Line 179: function 'ConvolutionInputGenerator.get_outstream_width'
    • Line 188: function 'ConvolutionInputGenerator.get_1d_conv_attrs_normalized'
    • Line 214: function 'ConvolutionInputGenerator.get_exp_cycles'
    • Line 217: function 'ConvolutionInputGenerator.bram_estimation'
    • Line 220: function 'ConvolutionInputGenerator.lut_estimation'
    • Line 223: function 'ConvolutionInputGenerator.uram_estimation'
    • Line 226: function 'ConvolutionInputGenerator.execute_node'
    • Line 265: function 'ConvolutionInputGenerator.get_tree_model_uniform_distribution_based'
    • Line 266: function 'ConvolutionInputGenerator.distribute_outputs_uniform'
    • Line 563: function 'ConvolutionInputGenerator.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/duplicatestreams.py:

    • Line 1: module 'duplicatestreams.py'
    • Line 40: function 'DuplicateStreams.init'
    • Line 43: function 'DuplicateStreams.get_nodeattr_types'
    • Line 60: function 'DuplicateStreams.get_num_output_streams'
    • Line 63: function 'DuplicateStreams.get_normal_input_shape'
    • Line 69: function 'DuplicateStreams.get_folded_input_shape'
    • Line 78: function 'DuplicateStreams.get_normal_output_shape'
    • Line 83: function 'DuplicateStreams.get_folded_output_shape'
    • Line 88: function 'DuplicateStreams.make_shape_compatible_op'
    • Line 93: function 'DuplicateStreams.infer_node_datatype'
    • Line 130: function 'DuplicateStreams.get_number_output_values'
    • Line 136: function 'DuplicateStreams.get_exp_cycles'
    • Line 140: function 'DuplicateStreams.execute_node'
    • Line 152: function 'DuplicateStreams.get_tree_model'
    • Line 162: function 'DuplicateStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/fmpadding.py:

    • Line 1: module 'fmpadding.py'
    • Line 41: function 'FMPadding.init'
    • Line 44: function 'FMPadding.get_nodeattr_types'
    • Line 76: function 'FMPadding.get_exp_cycles'
    • Line 84: function 'FMPadding.get_normal_input_shape'
    • Line 90: function 'FMPadding.get_normal_output_shape'
    • Line 97: function 'FMPadding.get_folded_input_shape'
    • Line 106: function 'FMPadding.get_folded_output_shape'
    • Line 115: function 'FMPadding.make_shape_compatible_op'
    • Line 122: function 'FMPadding.infer_node_datatype'
    • Line 135: function 'FMPadding.verify_node'
    • Line 150: function 'FMPadding.get_instream_width'
    • Line 155: function 'FMPadding.get_outstream_width'
    • Line 160: function 'FMPadding.get_number_output_values'
    • Line 164: function 'FMPadding.execute_node'
    • Line 175: function 'FMPadding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/hwcustomop.py:

    • Line 1: module 'hwcustomop.py'
    • Line 47: function 'HWCustomOp.init'
    • Line 51: function 'HWCustomOp.get_nodeattr_types'
    • Line 102: function 'HWCustomOp.make_shape_compatible_op'
    • Line 321: function 'HWCustomOp.derive_token_access_vectors'
    • Line 347: function 'HWCustomOp.derive_token_access_vectors_using_tree_model'
    • Line 514: function 'HWCustomOp.generate_hdl_dynload'
    • Line 615: function 'HWCustomOp.accumulate_char_fxn'

📄 src/finn/custom_op/fpgadataflow/labelselect.py:

    • Line 1: module 'labelselect.py'
    • Line 41: function 'LabelSelect.init'
    • Line 55: function 'LabelSelect.get_nodeattr_types'
    • Line 72: function 'LabelSelect.get_normal_input_shape'
    • Line 78: function 'LabelSelect.get_folded_input_shape'
    • Line 87: function 'LabelSelect.get_normal_output_shape'
    • Line 93: function 'LabelSelect.get_folded_output_shape'
    • Line 99: function 'LabelSelect.make_shape_compatible_op'
    • Line 114: function 'LabelSelect.infer_node_datatype'
    • Line 123: function 'LabelSelect.verify_node'
    • Line 147: function 'LabelSelect.get_number_output_values'
    • Line 150: function 'LabelSelect.execute_node'
    • Line 180: function 'LabelSelect.get_exp_cycles'
    • Line 187: function 'LabelSelect.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/matrixvectoractivation.py:

    • Line 1: module 'matrixvectoractivation.py'
    • Line 58: function 'MVAU.init'
    • Line 61: function 'MVAU.get_nodeattr_types'
    • Line 134: function 'MVAU.execute_node'
    • Line 176: function 'MVAU.verify_node'
    • Line 231: function 'MVAU.infer_node_datatype'
    • Line 265: function 'MVAU.get_instream_width'
    • Line 298: function 'MVAU.get_outstream_width'
    • Line 303: function 'MVAU.get_folded_input_shape'
    • Line 329: function 'MVAU.get_folded_output_shape'
    • Line 337: function 'MVAU.get_normal_input_shape'
    • Line 349: function 'MVAU.get_normal_output_shape'
    • Line 375: function 'MVAU.uram_estimation'
    • Line 437: function 'MVAU.bram_efficiency_estimation'
    • Line 463: function 'MVAU.get_exp_cycles'
    • Line 788: function 'MVAU.generate_params'
    • Line 863: function 'MVAU.get_op_and_param_counts'
    • Line 887: function 'MVAU.get_verilog_top_module_intf_names'
    • Line 913: function 'MVAU.code_generation_ipi'
    • Line 1098: function 'MVAU.get_tree_model'
    • Line 1147: function 'MVAU.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/pool.py:

    • Line 233: function 'Pool.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py:

    • Line 1: module 'streamingdatawidthconverter.py'
    • Line 44: function 'StreamingDataWidthConverter.get_nodeattr_types'
    • Line 68: function 'StreamingDataWidthConverter.get_normal_input_shape'
    • Line 72: function 'StreamingDataWidthConverter.get_normal_output_shape'
    • Line 76: function 'StreamingDataWidthConverter.get_iowidth_lcm'
    • Line 81: function 'StreamingDataWidthConverter.needs_lcm'
    • Line 88: function 'StreamingDataWidthConverter.check_divisible_iowidths'
    • Line 91: function 'StreamingDataWidthConverter.get_folded_input_shape'
    • Line 111: function 'StreamingDataWidthConverter.get_folded_output_shape'
    • Line 132: function 'StreamingDataWidthConverter.get_number_input_values'
    • Line 136: function 'StreamingDataWidthConverter.get_number_output_values'
    • Line 140: function 'StreamingDataWidthConverter.get_instream_width'
    • Line 144: function 'StreamingDataWidthConverter.get_outstream_width'
    • Line 148: function 'StreamingDataWidthConverter.infer_node_datatype'
    • Line 162: function 'StreamingDataWidthConverter.verify_node'
    • Line 179: function 'StreamingDataWidthConverter.execute_node'
    • Line 190: function 'StreamingDataWidthConverter.get_exp_cycles'
    • Line 222: function 'StreamingDataWidthConverter.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/thresholding.py:

    • Line 384: function 'Thresholding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/vectorvectoractivation.py:

    • Line 1067: function 'VVAU.get_tree_model'
    • Line 1122: function 'VVAU.derive_token_access_vectors'

📄 src/finn/transformation/fpgadataflow/derive_characteristic.py:

    • Line 1: module 'derive_characteristic.py'
    • Line 45: class 'JustInTimeSynthesize'
    • Line 46: function 'JustInTimeSynthesize.init'
    • Line 52: function 'JustInTimeSynthesize.apply'
    • Line 146: function 'DeriveTokenAccessVectors.init'
    • Line 166: function 'DeriveTokenAccessVectors.applyNodeLocal'
    • Line 196: function 'DeriveTokenAccessVectors.apply'
    • Line 214: function 'LocalStretchCharacteristicFunctions.init'
    • Line 219: function 'LocalStretchCharacteristicFunctions.applyNodeLocal'
    • Line 311: function 'get_top_producer_period'
    • Line 329: function 'get_top_consumer_period'
    • Line 395: function 'get_nodes_until_converging'
    • Line 406: function 'get_throughput'
    • Line 428: function 'get_parent_throughput'
    • Line 439: function 'get_parent'
    • Line 449: function 'get_consumer'
    • Line 455: function 'get_consumer_throughput'
    • Line 466: function 'get_true_period'
    • Line 473: function 'get_branch_nodes'
    • Line 481: function 'get_branch_volume'
    • Line 524: function 'calculate_peak_volume_delta'
    • Line 581: function 'compute_node_latency_init_periods'
    • Line 588: function 'max_dist'
    • Line 622: function 'get_full_branch_latency'
    • Line 629: function 'assign_extra_fifo_volume'
    • Line 738: function 'HandleBranches.init'
    • Line 743: function 'HandleBranches.apply'
    • Line 770: function 'ProducerDelayCharacteristicFunctions.init'
    • Line 775: function 'ProducerDelayCharacteristicFunctions.applyNodeLocal'
    • Line 845: function 'DelayCharacteristicFunctions.init'
    • Line 850: function 'DelayCharacteristicFunctions.applyNodeLocal'
    • Line 932: function 'inter_token_gaps'
    • Line 951: function 'remove_trailing_duplicates_keep_one'
    • Line 966: function 'remove_leading_duplicates_keep_one'
    • Line 989: function 'DeriveFIFOSizes.init'
    • Line 1017: function 'DeriveFIFOSizes.apply'

📄 src/finn/util/basic.py:

    • Line 410: function 'get_driver_shapes'
    • Line 502: function 'stretch'
    • Line 510: class 'Characteristic_Node'
    • Line 511: function 'Characteristic_Node.init'
    • Line 520: function 'Characteristic_Node.sum'
    • Line 581: function 'compress_numpy_to_string'
    • Line 597: function 'decompress_string_to_numpy'
    • Line 609: function 'compute_total_model_fifo_size'

Total missing docstrings: 184

How to Fix:

Please add docstrings to the missing functions, classes, and modules listed above.

Docstring Guidelines:

  • All modules should have a module-level docstring
  • All public functions and methods should have docstrings
  • All private functions should have docstrings
  • All classes should have docstrings
  • Use triple quotes (""") for docstrings
  • Follow PEP 257 conventions
Raw output from docstring checker
Checking 17 specified Python file(s) (excluding tests folder):
  - src/finn/analysis/fpgadataflow/dataflow_performance.py
  - src/finn/builder/build_dataflow_config.py
  - src/finn/builder/build_dataflow_steps.py
  - src/finn/custom_op/fpgadataflow/addstreams.py
  - src/finn/custom_op/fpgadataflow/channelwise_op.py
  - src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py
  - src/finn/custom_op/fpgadataflow/duplicatestreams.py
  - src/finn/custom_op/fpgadataflow/fmpadding.py
  - src/finn/custom_op/fpgadataflow/hwcustomop.py
  - src/finn/custom_op/fpgadataflow/labelselect.py
  - src/finn/custom_op/fpgadataflow/matrixvectoractivation.py
  - src/finn/custom_op/fpgadataflow/pool.py
  - src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py
  - src/finn/custom_op/fpgadataflow/thresholding.py
  - src/finn/custom_op/fpgadataflow/vectorvectoractivation.py
  - src/finn/transformation/fpgadataflow/derive_characteristic.py
  - src/finn/util/basic.py

❌ Missing docstrings found:

📄 src/finn/analysis/fpgadataflow/dataflow_performance.py:
  - Line 1: module 'dataflow_performance.py'

📄 src/finn/custom_op/fpgadataflow/addstreams.py:
  - Line 1: module 'addstreams.py'
  - Line 41: function 'AddStreams.__init__'
  - Line 44: function 'AddStreams.get_nodeattr_types'
  - Line 62: function 'AddStreams.get_normal_input_shape'
  - Line 68: function 'AddStreams.get_folded_input_shape'
  - Line 76: function 'AddStreams.get_normal_output_shape'
  - Line 79: function 'AddStreams.get_folded_output_shape'
  - Line 82: function 'AddStreams.infer_node_datatype'
  - Line 137: function 'AddStreams.get_exp_cycles'
  - Line 141: function 'AddStreams.execute_node'
  - Line 153: function 'AddStreams.prepare_tree_model'
  - Line 161: function 'AddStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/channelwise_op.py:
  - Line 1: module 'channelwise_op.py'
  - Line 80: function 'ChannelwiseOp.__init__'
  - Line 83: function 'ChannelwiseOp.get_nodeattr_types'
  - Line 112: function 'ChannelwiseOp.infer_node_datatype'
  - Line 162: function 'ChannelwiseOp.get_instream_width'
  - Line 172: function 'ChannelwiseOp.get_outstream_width'
  - Line 176: function 'ChannelwiseOp.get_folded_input_shape'
  - Line 189: function 'ChannelwiseOp.get_folded_output_shape'
  - Line 193: function 'ChannelwiseOp.get_normal_input_shape'
  - Line 206: function 'ChannelwiseOp.get_normal_output_shape'
  - Line 210: function 'ChannelwiseOp.get_exp_cycles'
  - Line 214: function 'ChannelwiseOp.execute_node'
  - Line 245: function 'ChannelwiseOp.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py:
  - Line 1: module 'convolutioninputgenerator.py'
  - Line 50: function 'ConvolutionInputGenerator.__init__'
  - Line 53: function 'ConvolutionInputGenerator.get_nodeattr_types'
  - Line 88: function 'ConvolutionInputGenerator.get_normal_input_shape'
  - Line 94: function 'ConvolutionInputGenerator.get_folded_input_shape'
  - Line 103: function 'ConvolutionInputGenerator.get_normal_output_shape'
  - Line 115: function 'ConvolutionInputGenerator.get_folded_output_shape'
  - Line 134: function 'ConvolutionInputGenerator.infer_node_datatype'
  - Line 179: function 'ConvolutionInputGenerator.get_outstream_width'
  - Line 188: function 'ConvolutionInputGenerator.get_1d_conv_attrs_normalized'
  - Line 214: function 'ConvolutionInputGenerator.get_exp_cycles'
  - Line 217: function 'ConvolutionInputGenerator.bram_estimation'
  - Line 220: function 'ConvolutionInputGenerator.lut_estimation'
  - Line 223: function 'ConvolutionInputGenerator.uram_estimation'
  - Line 226: function 'ConvolutionInputGenerator.execute_node'
  - Line 265: function 'ConvolutionInputGenerator.get_tree_model_uniform_distribution_based'
  - Line 266: function 'ConvolutionInputGenerator.distribute_outputs_uniform'
  - Line 563: function 'ConvolutionInputGenerator.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/duplicatestreams.py:
  - Line 1: module 'duplicatestreams.py'
  - Line 40: function 'DuplicateStreams.__init__'
  - Line 43: function 'DuplicateStreams.get_nodeattr_types'
  - Line 60: function 'DuplicateStreams.get_num_output_streams'
  - Line 63: function 'DuplicateStreams.get_normal_input_shape'
  - Line 69: function 'DuplicateStreams.get_folded_input_shape'
  - Line 78: function 'DuplicateStreams.get_normal_output_shape'
  - Line 83: function 'DuplicateStreams.get_folded_output_shape'
  - Line 88: function 'DuplicateStreams.make_shape_compatible_op'
  - Line 93: function 'DuplicateStreams.infer_node_datatype'
  - Line 130: function 'DuplicateStreams.get_number_output_values'
  - Line 136: function 'DuplicateStreams.get_exp_cycles'
  - Line 140: function 'DuplicateStreams.execute_node'
  - Line 152: function 'DuplicateStreams.get_tree_model'
  - Line 162: function 'DuplicateStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/fmpadding.py:
  - Line 1: module 'fmpadding.py'
  - Line 41: function 'FMPadding.__init__'
  - Line 44: function 'FMPadding.get_nodeattr_types'
  - Line 76: function 'FMPadding.get_exp_cycles'
  - Line 84: function 'FMPadding.get_normal_input_shape'
  - Line 90: function 'FMPadding.get_normal_output_shape'
  - Line 97: function 'FMPadding.get_folded_input_shape'
  - Line 106: function 'FMPadding.get_folded_output_shape'
  - Line 115: function 'FMPadding.make_shape_compatible_op'
  - Line 122: function 'FMPadding.infer_node_datatype'
  - Line 135: function 'FMPadding.verify_node'
  - Line 150: function 'FMPadding.get_instream_width'
  - Line 155: function 'FMPadding.get_outstream_width'
  - Line 160: function 'FMPadding.get_number_output_values'
  - Line 164: function 'FMPadding.execute_node'
  - Line 175: function 'FMPadding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/hwcustomop.py:
  - Line 1: module 'hwcustomop.py'
  - Line 47: function 'HWCustomOp.__init__'
  - Line 51: function 'HWCustomOp.get_nodeattr_types'
  - Line 102: function 'HWCustomOp.make_shape_compatible_op'
  - Line 321: function 'HWCustomOp.derive_token_access_vectors'
  - Line 347: function 'HWCustomOp.derive_token_access_vectors_using_tree_model'
  - Line 514: function 'HWCustomOp.generate_hdl_dynload'
  - Line 615: function 'HWCustomOp.accumulate_char_fxn'

📄 src/finn/custom_op/fpgadataflow/labelselect.py:
  - Line 1: module 'labelselect.py'
  - Line 41: function 'LabelSelect.__init__'
  - Line 55: function 'LabelSelect.get_nodeattr_types'
  - Line 72: function 'LabelSelect.get_normal_input_shape'
  - Line 78: function 'LabelSelect.get_folded_input_shape'
  - Line 87: function 'LabelSelect.get_normal_output_shape'
  - Line 93: function 'LabelSelect.get_folded_output_shape'
  - Line 99: function 'LabelSelect.make_shape_compatible_op'
  - Line 114: function 'LabelSelect.infer_node_datatype'
  - Line 123: function 'LabelSelect.verify_node'
  - Line 147: function 'LabelSelect.get_number_output_values'
  - Line 150: function 'LabelSelect.execute_node'
  - Line 180: function 'LabelSelect.get_exp_cycles'
  - Line 187: function 'LabelSelect.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/matrixvectoractivation.py:
  - Line 1: module 'matrixvectoractivation.py'
  - Line 58: function 'MVAU.__init__'
  - Line 61: function 'MVAU.get_nodeattr_types'
  - Line 134: function 'MVAU.execute_node'
  - Line 176: function 'MVAU.verify_node'
  - Line 231: function 'MVAU.infer_node_datatype'
  - Line 265: function 'MVAU.get_instream_width'
  - Line 298: function 'MVAU.get_outstream_width'
  - Line 303: function 'MVAU.get_folded_input_shape'
  - Line 329: function 'MVAU.get_folded_output_shape'
  - Line 337: function 'MVAU.get_normal_input_shape'
  - Line 349: function 'MVAU.get_normal_output_shape'
  - Line 375: function 'MVAU.uram_estimation'
  - Line 437: function 'MVAU.bram_efficiency_estimation'
  - Line 463: function 'MVAU.get_exp_cycles'
  - Line 788: function 'MVAU.generate_params'
  - Line 863: function 'MVAU.get_op_and_param_counts'
  - Line 887: function 'MVAU.get_verilog_top_module_intf_names'
  - Line 913: function 'MVAU.code_generation_ipi'
  - Line 1098: function 'MVAU.get_tree_model'
  - Line 1147: function 'MVAU.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/pool.py:
  - Line 233: function 'Pool.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py:
  - Line 1: module 'streamingdatawidthconverter.py'
  - Line 44: function 'StreamingDataWidthConverter.get_nodeattr_types'
  - Line 68: function 'StreamingDataWidthConverter.get_normal_input_shape'
  - Line 72: function 'StreamingDataWidthConverter.get_normal_output_shape'
  - Line 76: function 'StreamingDataWidthConverter.get_iowidth_lcm'
  - Line 81: function 'StreamingDataWidthConverter.needs_lcm'
  - Line 88: function 'StreamingDataWidthConverter.check_divisible_iowidths'
  - Line 91: function 'StreamingDataWidthConverter.get_folded_input_shape'
  - Line 111: function 'StreamingDataWidthConverter.get_folded_output_shape'
  - Line 132: function 'StreamingDataWidthConverter.get_number_input_values'
  - Line 136: function 'StreamingDataWidthConverter.get_number_output_values'
  - Line 140: function 'StreamingDataWidthConverter.get_instream_width'
  - Line 144: function 'StreamingDataWidthConverter.get_outstream_width'
  - Line 148: function 'StreamingDataWidthConverter.infer_node_datatype'
  - Line 162: function 'StreamingDataWidthConverter.verify_node'
  - Line 179: function 'StreamingDataWidthConverter.execute_node'
  - Line 190: function 'StreamingDataWidthConverter.get_exp_cycles'
  - Line 222: function 'StreamingDataWidthConverter.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/thresholding.py:
  - Line 384: function 'Thresholding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/vectorvectoractivation.py:
  - Line 1067: function 'VVAU.get_tree_model'
  - Line 1122: function 'VVAU.derive_token_access_vectors'

📄 src/finn/transformation/fpgadataflow/derive_characteristic.py:
  - Line 1: module 'derive_characteristic.py'
  - Line 45: class 'JustInTimeSynthesize'
  - Line 46: function 'JustInTimeSynthesize.__init__'
  - Line 52: function 'JustInTimeSynthesize.apply'
  - Line 146: function 'DeriveTokenAccessVectors.__init__'
  - Line 166: function 'DeriveTokenAccessVectors.applyNodeLocal'
  - Line 196: function 'DeriveTokenAccessVectors.apply'
  - Line 214: function 'LocalStretchCharacteristicFunctions.__init__'
  - Line 219: function 'LocalStretchCharacteristicFunctions.applyNodeLocal'
  - Line 311: function 'get_top_producer_period'
  - Line 329: function 'get_top_consumer_period'
  - Line 395: function 'get_nodes_until_converging'
  - Line 406: function 'get_throughput'
  - Line 428: function 'get_parent_throughput'
  - Line 439: function 'get_parent'
  - Line 449: function 'get_consumer'
  - Line 455: function 'get_consumer_throughput'
  - Line 466: function 'get_true_period'
  - Line 473: function 'get_branch_nodes'
  - Line 481: function 'get_branch_volume'
  - Line 524: function 'calculate_peak_volume_delta'
  - Line 581: function 'compute_node_latency_init_periods'
  - Line 588: function 'max_dist'
  - Line 622: function 'get_full_branch_latency'
  - Line 629: function 'assign_extra_fifo_volume'
  - Line 738: function 'HandleBranches.__init__'
  - Line 743: function 'HandleBranches.apply'
  - Line 770: function 'ProducerDelayCharacteristicFunctions.__init__'
  - Line 775: function 'ProducerDelayCharacteristicFunctions.applyNodeLocal'
  - Line 845: function 'DelayCharacteristicFunctions.__init__'
  - Line 850: function 'DelayCharacteristicFunctions.applyNodeLocal'
  - Line 932: function 'inter_token_gaps'
  - Line 951: function 'remove_trailing_duplicates_keep_one'
  - Line 966: function 'remove_leading_duplicates_keep_one'
  - Line 989: function 'DeriveFIFOSizes.__init__'
  - Line 1017: function 'DeriveFIFOSizes.apply'

📄 src/finn/util/basic.py:
  - Line 410: function 'get_driver_shapes'
  - Line 502: function 'stretch'
  - Line 510: class 'Characteristic_Node'
  - Line 511: function 'Characteristic_Node.__init__'
  - Line 520: function 'Characteristic_Node.sum'
  - Line 581: function 'compress_numpy_to_string'
  - Line 597: function 'decompress_string_to_numpy'
  - Line 609: function 'compute_total_model_fifo_size'

Total missing docstrings: 184

@github-actions
Copy link
Copy Markdown

github-actions bot commented Feb 8, 2026

📋 Docstring Check Report

Checked files:

  • src/finn/analysis/fpgadataflow/dataflow_performance.py
  • src/finn/builder/build_dataflow_config.py
  • src/finn/builder/build_dataflow_steps.py
  • src/finn/custom_op/fpgadataflow/addstreams.py
  • src/finn/custom_op/fpgadataflow/channelwise_op.py
  • src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py
  • src/finn/custom_op/fpgadataflow/duplicatestreams.py
  • src/finn/custom_op/fpgadataflow/fmpadding.py
  • src/finn/custom_op/fpgadataflow/hwcustomop.py
  • src/finn/custom_op/fpgadataflow/labelselect.py
  • src/finn/custom_op/fpgadataflow/matrixvectoractivation.py
  • src/finn/custom_op/fpgadataflow/pool.py
  • src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py
  • src/finn/custom_op/fpgadataflow/thresholding.py
  • src/finn/custom_op/fpgadataflow/vectorvectoractivation.py
  • src/finn/transformation/fpgadataflow/derive_characteristic.py
  • src/finn/util/basic.py
  • tests/fpgadataflow/test_convert_to_hw_pool_batch.py
  • tests/fpgadataflow/test_fifosizing.py
  • tests/fpgadataflow/test_fpgadataflow_channelwise_ops.py
  • tests/fpgadataflow/test_fpgadataflow_convinputgenerator.py
  • tests/fpgadataflow/test_fpgadataflow_downsampler.py
  • tests/fpgadataflow/test_fpgadataflow_dwc.py
  • tests/fpgadataflow/test_fpgadataflow_fmpadding.py
  • tests/fpgadataflow/test_fpgadataflow_labelselect.py
  • tests/fpgadataflow/test_fpgadataflow_mvau.py
  • tests/fpgadataflow/test_fpgadataflow_thresholding.py
  • tests/fpgadataflow/test_fpgadataflow_vvau.py
  • tests/testing_util/test.py

Docstring check failed!

Missing Docstrings Details:

  • src/finn/analysis/fpgadataflow/dataflow_performance.py
  • src/finn/builder/build_dataflow_config.py
  • src/finn/builder/build_dataflow_steps.py
  • src/finn/custom_op/fpgadataflow/addstreams.py
  • src/finn/custom_op/fpgadataflow/channelwise_op.py
  • src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py
  • src/finn/custom_op/fpgadataflow/duplicatestreams.py
  • src/finn/custom_op/fpgadataflow/fmpadding.py
  • src/finn/custom_op/fpgadataflow/hwcustomop.py
  • src/finn/custom_op/fpgadataflow/labelselect.py
  • src/finn/custom_op/fpgadataflow/matrixvectoractivation.py
  • src/finn/custom_op/fpgadataflow/pool.py
  • src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py
  • src/finn/custom_op/fpgadataflow/thresholding.py
  • src/finn/custom_op/fpgadataflow/vectorvectoractivation.py
  • src/finn/transformation/fpgadataflow/derive_characteristic.py
  • src/finn/util/basic.py

📄 src/finn/analysis/fpgadataflow/dataflow_performance.py:

    • Line 1: module 'dataflow_performance.py'

📄 src/finn/custom_op/fpgadataflow/addstreams.py:

    • Line 1: module 'addstreams.py'
    • Line 41: function 'AddStreams.init'
    • Line 44: function 'AddStreams.get_nodeattr_types'
    • Line 62: function 'AddStreams.get_normal_input_shape'
    • Line 68: function 'AddStreams.get_folded_input_shape'
    • Line 76: function 'AddStreams.get_normal_output_shape'
    • Line 79: function 'AddStreams.get_folded_output_shape'
    • Line 82: function 'AddStreams.infer_node_datatype'
    • Line 137: function 'AddStreams.get_exp_cycles'
    • Line 141: function 'AddStreams.execute_node'
    • Line 153: function 'AddStreams.prepare_tree_model'
    • Line 161: function 'AddStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/channelwise_op.py:

    • Line 1: module 'channelwise_op.py'
    • Line 80: function 'ChannelwiseOp.init'
    • Line 83: function 'ChannelwiseOp.get_nodeattr_types'
    • Line 112: function 'ChannelwiseOp.infer_node_datatype'
    • Line 162: function 'ChannelwiseOp.get_instream_width'
    • Line 172: function 'ChannelwiseOp.get_outstream_width'
    • Line 176: function 'ChannelwiseOp.get_folded_input_shape'
    • Line 189: function 'ChannelwiseOp.get_folded_output_shape'
    • Line 193: function 'ChannelwiseOp.get_normal_input_shape'
    • Line 206: function 'ChannelwiseOp.get_normal_output_shape'
    • Line 210: function 'ChannelwiseOp.get_exp_cycles'
    • Line 214: function 'ChannelwiseOp.execute_node'
    • Line 245: function 'ChannelwiseOp.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py:

    • Line 1: module 'convolutioninputgenerator.py'
    • Line 50: function 'ConvolutionInputGenerator.init'
    • Line 53: function 'ConvolutionInputGenerator.get_nodeattr_types'
    • Line 88: function 'ConvolutionInputGenerator.get_normal_input_shape'
    • Line 94: function 'ConvolutionInputGenerator.get_folded_input_shape'
    • Line 103: function 'ConvolutionInputGenerator.get_normal_output_shape'
    • Line 115: function 'ConvolutionInputGenerator.get_folded_output_shape'
    • Line 134: function 'ConvolutionInputGenerator.infer_node_datatype'
    • Line 179: function 'ConvolutionInputGenerator.get_outstream_width'
    • Line 188: function 'ConvolutionInputGenerator.get_1d_conv_attrs_normalized'
    • Line 214: function 'ConvolutionInputGenerator.get_exp_cycles'
    • Line 217: function 'ConvolutionInputGenerator.bram_estimation'
    • Line 220: function 'ConvolutionInputGenerator.lut_estimation'
    • Line 223: function 'ConvolutionInputGenerator.uram_estimation'
    • Line 226: function 'ConvolutionInputGenerator.execute_node'
    • Line 265: function 'ConvolutionInputGenerator.get_tree_model_uniform_distribution_based'
    • Line 266: function 'ConvolutionInputGenerator.distribute_outputs_uniform'
    • Line 563: function 'ConvolutionInputGenerator.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/duplicatestreams.py:

    • Line 1: module 'duplicatestreams.py'
    • Line 40: function 'DuplicateStreams.init'
    • Line 43: function 'DuplicateStreams.get_nodeattr_types'
    • Line 60: function 'DuplicateStreams.get_num_output_streams'
    • Line 63: function 'DuplicateStreams.get_normal_input_shape'
    • Line 69: function 'DuplicateStreams.get_folded_input_shape'
    • Line 78: function 'DuplicateStreams.get_normal_output_shape'
    • Line 83: function 'DuplicateStreams.get_folded_output_shape'
    • Line 88: function 'DuplicateStreams.make_shape_compatible_op'
    • Line 93: function 'DuplicateStreams.infer_node_datatype'
    • Line 130: function 'DuplicateStreams.get_number_output_values'
    • Line 136: function 'DuplicateStreams.get_exp_cycles'
    • Line 140: function 'DuplicateStreams.execute_node'
    • Line 152: function 'DuplicateStreams.get_tree_model'
    • Line 162: function 'DuplicateStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/fmpadding.py:

    • Line 1: module 'fmpadding.py'
    • Line 41: function 'FMPadding.init'
    • Line 44: function 'FMPadding.get_nodeattr_types'
    • Line 76: function 'FMPadding.get_exp_cycles'
    • Line 84: function 'FMPadding.get_normal_input_shape'
    • Line 90: function 'FMPadding.get_normal_output_shape'
    • Line 97: function 'FMPadding.get_folded_input_shape'
    • Line 106: function 'FMPadding.get_folded_output_shape'
    • Line 115: function 'FMPadding.make_shape_compatible_op'
    • Line 122: function 'FMPadding.infer_node_datatype'
    • Line 135: function 'FMPadding.verify_node'
    • Line 150: function 'FMPadding.get_instream_width'
    • Line 155: function 'FMPadding.get_outstream_width'
    • Line 160: function 'FMPadding.get_number_output_values'
    • Line 164: function 'FMPadding.execute_node'
    • Line 175: function 'FMPadding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/hwcustomop.py:

    • Line 1: module 'hwcustomop.py'
    • Line 47: function 'HWCustomOp.init'
    • Line 51: function 'HWCustomOp.get_nodeattr_types'
    • Line 102: function 'HWCustomOp.make_shape_compatible_op'
    • Line 321: function 'HWCustomOp.derive_token_access_vectors'
    • Line 347: function 'HWCustomOp.derive_token_access_vectors_using_tree_model'
    • Line 514: function 'HWCustomOp.generate_hdl_dynload'
    • Line 615: function 'HWCustomOp.accumulate_char_fxn'

📄 src/finn/custom_op/fpgadataflow/labelselect.py:

    • Line 1: module 'labelselect.py'
    • Line 41: function 'LabelSelect.init'
    • Line 55: function 'LabelSelect.get_nodeattr_types'
    • Line 72: function 'LabelSelect.get_normal_input_shape'
    • Line 78: function 'LabelSelect.get_folded_input_shape'
    • Line 87: function 'LabelSelect.get_normal_output_shape'
    • Line 93: function 'LabelSelect.get_folded_output_shape'
    • Line 99: function 'LabelSelect.make_shape_compatible_op'
    • Line 114: function 'LabelSelect.infer_node_datatype'
    • Line 123: function 'LabelSelect.verify_node'
    • Line 147: function 'LabelSelect.get_number_output_values'
    • Line 150: function 'LabelSelect.execute_node'
    • Line 180: function 'LabelSelect.get_exp_cycles'
    • Line 187: function 'LabelSelect.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/matrixvectoractivation.py:

    • Line 1: module 'matrixvectoractivation.py'
    • Line 58: function 'MVAU.init'
    • Line 61: function 'MVAU.get_nodeattr_types'
    • Line 134: function 'MVAU.execute_node'
    • Line 176: function 'MVAU.verify_node'
    • Line 231: function 'MVAU.infer_node_datatype'
    • Line 265: function 'MVAU.get_instream_width'
    • Line 298: function 'MVAU.get_outstream_width'
    • Line 303: function 'MVAU.get_folded_input_shape'
    • Line 329: function 'MVAU.get_folded_output_shape'
    • Line 337: function 'MVAU.get_normal_input_shape'
    • Line 349: function 'MVAU.get_normal_output_shape'
    • Line 375: function 'MVAU.uram_estimation'
    • Line 437: function 'MVAU.bram_efficiency_estimation'
    • Line 463: function 'MVAU.get_exp_cycles'
    • Line 788: function 'MVAU.generate_params'
    • Line 863: function 'MVAU.get_op_and_param_counts'
    • Line 887: function 'MVAU.get_verilog_top_module_intf_names'
    • Line 913: function 'MVAU.code_generation_ipi'
    • Line 1098: function 'MVAU.get_tree_model'
    • Line 1147: function 'MVAU.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/pool.py:

    • Line 233: function 'Pool.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py:

    • Line 1: module 'streamingdatawidthconverter.py'
    • Line 44: function 'StreamingDataWidthConverter.get_nodeattr_types'
    • Line 68: function 'StreamingDataWidthConverter.get_normal_input_shape'
    • Line 72: function 'StreamingDataWidthConverter.get_normal_output_shape'
    • Line 76: function 'StreamingDataWidthConverter.get_iowidth_lcm'
    • Line 81: function 'StreamingDataWidthConverter.needs_lcm'
    • Line 88: function 'StreamingDataWidthConverter.check_divisible_iowidths'
    • Line 91: function 'StreamingDataWidthConverter.get_folded_input_shape'
    • Line 111: function 'StreamingDataWidthConverter.get_folded_output_shape'
    • Line 132: function 'StreamingDataWidthConverter.get_number_input_values'
    • Line 136: function 'StreamingDataWidthConverter.get_number_output_values'
    • Line 140: function 'StreamingDataWidthConverter.get_instream_width'
    • Line 144: function 'StreamingDataWidthConverter.get_outstream_width'
    • Line 148: function 'StreamingDataWidthConverter.infer_node_datatype'
    • Line 162: function 'StreamingDataWidthConverter.verify_node'
    • Line 179: function 'StreamingDataWidthConverter.execute_node'
    • Line 190: function 'StreamingDataWidthConverter.get_exp_cycles'
    • Line 222: function 'StreamingDataWidthConverter.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/thresholding.py:

    • Line 384: function 'Thresholding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/vectorvectoractivation.py:

    • Line 1067: function 'VVAU.get_tree_model'
    • Line 1122: function 'VVAU.derive_token_access_vectors'

📄 src/finn/transformation/fpgadataflow/derive_characteristic.py:

    • Line 1: module 'derive_characteristic.py'
    • Line 45: class 'JustInTimeSynthesize'
    • Line 46: function 'JustInTimeSynthesize.init'
    • Line 52: function 'JustInTimeSynthesize.apply'
    • Line 146: function 'DeriveTokenAccessVectors.init'
    • Line 166: function 'DeriveTokenAccessVectors.applyNodeLocal'
    • Line 196: function 'DeriveTokenAccessVectors.apply'
    • Line 214: function 'LocalStretchCharacteristicFunctions.init'
    • Line 219: function 'LocalStretchCharacteristicFunctions.applyNodeLocal'
    • Line 311: function 'get_top_producer_period'
    • Line 329: function 'get_top_consumer_period'
    • Line 395: function 'get_nodes_until_converging'
    • Line 406: function 'get_throughput'
    • Line 428: function 'get_parent_throughput'
    • Line 439: function 'get_parent'
    • Line 449: function 'get_consumer'
    • Line 455: function 'get_consumer_throughput'
    • Line 466: function 'get_true_period'
    • Line 473: function 'get_branch_nodes'
    • Line 481: function 'get_branch_volume'
    • Line 524: function 'calculate_peak_volume_delta'
    • Line 581: function 'compute_node_latency_init_periods'
    • Line 588: function 'max_dist'
    • Line 622: function 'get_full_branch_latency'
    • Line 629: function 'assign_extra_fifo_volume'
    • Line 738: function 'HandleBranches.init'
    • Line 743: function 'HandleBranches.apply'
    • Line 770: function 'ProducerDelayCharacteristicFunctions.init'
    • Line 775: function 'ProducerDelayCharacteristicFunctions.applyNodeLocal'
    • Line 845: function 'DelayCharacteristicFunctions.init'
    • Line 850: function 'DelayCharacteristicFunctions.applyNodeLocal'
    • Line 932: function 'inter_token_gaps'
    • Line 951: function 'remove_trailing_duplicates_keep_one'
    • Line 966: function 'remove_leading_duplicates_keep_one'
    • Line 989: function 'DeriveFIFOSizes.init'
    • Line 1017: function 'DeriveFIFOSizes.apply'

📄 src/finn/util/basic.py:

    • Line 410: function 'get_driver_shapes'
    • Line 502: function 'stretch'
    • Line 510: class 'Characteristic_Node'
    • Line 511: function 'Characteristic_Node.init'
    • Line 520: function 'Characteristic_Node.sum'
    • Line 581: function 'compress_numpy_to_string'
    • Line 597: function 'decompress_string_to_numpy'
    • Line 609: function 'compute_total_model_fifo_size'

Total missing docstrings: 184

How to Fix:

Please add docstrings to the missing functions, classes, and modules listed above.

Docstring Guidelines:

  • All modules should have a module-level docstring
  • All public functions and methods should have docstrings
  • All private functions should have docstrings
  • All classes should have docstrings
  • Use triple quotes (""") for docstrings
  • Follow PEP 257 conventions
Raw output from docstring checker
Checking 17 specified Python file(s) (excluding tests folder):
  - src/finn/analysis/fpgadataflow/dataflow_performance.py
  - src/finn/builder/build_dataflow_config.py
  - src/finn/builder/build_dataflow_steps.py
  - src/finn/custom_op/fpgadataflow/addstreams.py
  - src/finn/custom_op/fpgadataflow/channelwise_op.py
  - src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py
  - src/finn/custom_op/fpgadataflow/duplicatestreams.py
  - src/finn/custom_op/fpgadataflow/fmpadding.py
  - src/finn/custom_op/fpgadataflow/hwcustomop.py
  - src/finn/custom_op/fpgadataflow/labelselect.py
  - src/finn/custom_op/fpgadataflow/matrixvectoractivation.py
  - src/finn/custom_op/fpgadataflow/pool.py
  - src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py
  - src/finn/custom_op/fpgadataflow/thresholding.py
  - src/finn/custom_op/fpgadataflow/vectorvectoractivation.py
  - src/finn/transformation/fpgadataflow/derive_characteristic.py
  - src/finn/util/basic.py

❌ Missing docstrings found:

📄 src/finn/analysis/fpgadataflow/dataflow_performance.py:
  - Line 1: module 'dataflow_performance.py'

📄 src/finn/custom_op/fpgadataflow/addstreams.py:
  - Line 1: module 'addstreams.py'
  - Line 41: function 'AddStreams.__init__'
  - Line 44: function 'AddStreams.get_nodeattr_types'
  - Line 62: function 'AddStreams.get_normal_input_shape'
  - Line 68: function 'AddStreams.get_folded_input_shape'
  - Line 76: function 'AddStreams.get_normal_output_shape'
  - Line 79: function 'AddStreams.get_folded_output_shape'
  - Line 82: function 'AddStreams.infer_node_datatype'
  - Line 137: function 'AddStreams.get_exp_cycles'
  - Line 141: function 'AddStreams.execute_node'
  - Line 153: function 'AddStreams.prepare_tree_model'
  - Line 161: function 'AddStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/channelwise_op.py:
  - Line 1: module 'channelwise_op.py'
  - Line 80: function 'ChannelwiseOp.__init__'
  - Line 83: function 'ChannelwiseOp.get_nodeattr_types'
  - Line 112: function 'ChannelwiseOp.infer_node_datatype'
  - Line 162: function 'ChannelwiseOp.get_instream_width'
  - Line 172: function 'ChannelwiseOp.get_outstream_width'
  - Line 176: function 'ChannelwiseOp.get_folded_input_shape'
  - Line 189: function 'ChannelwiseOp.get_folded_output_shape'
  - Line 193: function 'ChannelwiseOp.get_normal_input_shape'
  - Line 206: function 'ChannelwiseOp.get_normal_output_shape'
  - Line 210: function 'ChannelwiseOp.get_exp_cycles'
  - Line 214: function 'ChannelwiseOp.execute_node'
  - Line 245: function 'ChannelwiseOp.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py:
  - Line 1: module 'convolutioninputgenerator.py'
  - Line 50: function 'ConvolutionInputGenerator.__init__'
  - Line 53: function 'ConvolutionInputGenerator.get_nodeattr_types'
  - Line 88: function 'ConvolutionInputGenerator.get_normal_input_shape'
  - Line 94: function 'ConvolutionInputGenerator.get_folded_input_shape'
  - Line 103: function 'ConvolutionInputGenerator.get_normal_output_shape'
  - Line 115: function 'ConvolutionInputGenerator.get_folded_output_shape'
  - Line 134: function 'ConvolutionInputGenerator.infer_node_datatype'
  - Line 179: function 'ConvolutionInputGenerator.get_outstream_width'
  - Line 188: function 'ConvolutionInputGenerator.get_1d_conv_attrs_normalized'
  - Line 214: function 'ConvolutionInputGenerator.get_exp_cycles'
  - Line 217: function 'ConvolutionInputGenerator.bram_estimation'
  - Line 220: function 'ConvolutionInputGenerator.lut_estimation'
  - Line 223: function 'ConvolutionInputGenerator.uram_estimation'
  - Line 226: function 'ConvolutionInputGenerator.execute_node'
  - Line 265: function 'ConvolutionInputGenerator.get_tree_model_uniform_distribution_based'
  - Line 266: function 'ConvolutionInputGenerator.distribute_outputs_uniform'
  - Line 563: function 'ConvolutionInputGenerator.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/duplicatestreams.py:
  - Line 1: module 'duplicatestreams.py'
  - Line 40: function 'DuplicateStreams.__init__'
  - Line 43: function 'DuplicateStreams.get_nodeattr_types'
  - Line 60: function 'DuplicateStreams.get_num_output_streams'
  - Line 63: function 'DuplicateStreams.get_normal_input_shape'
  - Line 69: function 'DuplicateStreams.get_folded_input_shape'
  - Line 78: function 'DuplicateStreams.get_normal_output_shape'
  - Line 83: function 'DuplicateStreams.get_folded_output_shape'
  - Line 88: function 'DuplicateStreams.make_shape_compatible_op'
  - Line 93: function 'DuplicateStreams.infer_node_datatype'
  - Line 130: function 'DuplicateStreams.get_number_output_values'
  - Line 136: function 'DuplicateStreams.get_exp_cycles'
  - Line 140: function 'DuplicateStreams.execute_node'
  - Line 152: function 'DuplicateStreams.get_tree_model'
  - Line 162: function 'DuplicateStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/fmpadding.py:
  - Line 1: module 'fmpadding.py'
  - Line 41: function 'FMPadding.__init__'
  - Line 44: function 'FMPadding.get_nodeattr_types'
  - Line 76: function 'FMPadding.get_exp_cycles'
  - Line 84: function 'FMPadding.get_normal_input_shape'
  - Line 90: function 'FMPadding.get_normal_output_shape'
  - Line 97: function 'FMPadding.get_folded_input_shape'
  - Line 106: function 'FMPadding.get_folded_output_shape'
  - Line 115: function 'FMPadding.make_shape_compatible_op'
  - Line 122: function 'FMPadding.infer_node_datatype'
  - Line 135: function 'FMPadding.verify_node'
  - Line 150: function 'FMPadding.get_instream_width'
  - Line 155: function 'FMPadding.get_outstream_width'
  - Line 160: function 'FMPadding.get_number_output_values'
  - Line 164: function 'FMPadding.execute_node'
  - Line 175: function 'FMPadding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/hwcustomop.py:
  - Line 1: module 'hwcustomop.py'
  - Line 47: function 'HWCustomOp.__init__'
  - Line 51: function 'HWCustomOp.get_nodeattr_types'
  - Line 102: function 'HWCustomOp.make_shape_compatible_op'
  - Line 321: function 'HWCustomOp.derive_token_access_vectors'
  - Line 347: function 'HWCustomOp.derive_token_access_vectors_using_tree_model'
  - Line 514: function 'HWCustomOp.generate_hdl_dynload'
  - Line 615: function 'HWCustomOp.accumulate_char_fxn'

📄 src/finn/custom_op/fpgadataflow/labelselect.py:
  - Line 1: module 'labelselect.py'
  - Line 41: function 'LabelSelect.__init__'
  - Line 55: function 'LabelSelect.get_nodeattr_types'
  - Line 72: function 'LabelSelect.get_normal_input_shape'
  - Line 78: function 'LabelSelect.get_folded_input_shape'
  - Line 87: function 'LabelSelect.get_normal_output_shape'
  - Line 93: function 'LabelSelect.get_folded_output_shape'
  - Line 99: function 'LabelSelect.make_shape_compatible_op'
  - Line 114: function 'LabelSelect.infer_node_datatype'
  - Line 123: function 'LabelSelect.verify_node'
  - Line 147: function 'LabelSelect.get_number_output_values'
  - Line 150: function 'LabelSelect.execute_node'
  - Line 180: function 'LabelSelect.get_exp_cycles'
  - Line 187: function 'LabelSelect.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/matrixvectoractivation.py:
  - Line 1: module 'matrixvectoractivation.py'
  - Line 58: function 'MVAU.__init__'
  - Line 61: function 'MVAU.get_nodeattr_types'
  - Line 134: function 'MVAU.execute_node'
  - Line 176: function 'MVAU.verify_node'
  - Line 231: function 'MVAU.infer_node_datatype'
  - Line 265: function 'MVAU.get_instream_width'
  - Line 298: function 'MVAU.get_outstream_width'
  - Line 303: function 'MVAU.get_folded_input_shape'
  - Line 329: function 'MVAU.get_folded_output_shape'
  - Line 337: function 'MVAU.get_normal_input_shape'
  - Line 349: function 'MVAU.get_normal_output_shape'
  - Line 375: function 'MVAU.uram_estimation'
  - Line 437: function 'MVAU.bram_efficiency_estimation'
  - Line 463: function 'MVAU.get_exp_cycles'
  - Line 788: function 'MVAU.generate_params'
  - Line 863: function 'MVAU.get_op_and_param_counts'
  - Line 887: function 'MVAU.get_verilog_top_module_intf_names'
  - Line 913: function 'MVAU.code_generation_ipi'
  - Line 1098: function 'MVAU.get_tree_model'
  - Line 1147: function 'MVAU.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/pool.py:
  - Line 233: function 'Pool.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py:
  - Line 1: module 'streamingdatawidthconverter.py'
  - Line 44: function 'StreamingDataWidthConverter.get_nodeattr_types'
  - Line 68: function 'StreamingDataWidthConverter.get_normal_input_shape'
  - Line 72: function 'StreamingDataWidthConverter.get_normal_output_shape'
  - Line 76: function 'StreamingDataWidthConverter.get_iowidth_lcm'
  - Line 81: function 'StreamingDataWidthConverter.needs_lcm'
  - Line 88: function 'StreamingDataWidthConverter.check_divisible_iowidths'
  - Line 91: function 'StreamingDataWidthConverter.get_folded_input_shape'
  - Line 111: function 'StreamingDataWidthConverter.get_folded_output_shape'
  - Line 132: function 'StreamingDataWidthConverter.get_number_input_values'
  - Line 136: function 'StreamingDataWidthConverter.get_number_output_values'
  - Line 140: function 'StreamingDataWidthConverter.get_instream_width'
  - Line 144: function 'StreamingDataWidthConverter.get_outstream_width'
  - Line 148: function 'StreamingDataWidthConverter.infer_node_datatype'
  - Line 162: function 'StreamingDataWidthConverter.verify_node'
  - Line 179: function 'StreamingDataWidthConverter.execute_node'
  - Line 190: function 'StreamingDataWidthConverter.get_exp_cycles'
  - Line 222: function 'StreamingDataWidthConverter.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/thresholding.py:
  - Line 384: function 'Thresholding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/vectorvectoractivation.py:
  - Line 1067: function 'VVAU.get_tree_model'
  - Line 1122: function 'VVAU.derive_token_access_vectors'

📄 src/finn/transformation/fpgadataflow/derive_characteristic.py:
  - Line 1: module 'derive_characteristic.py'
  - Line 45: class 'JustInTimeSynthesize'
  - Line 46: function 'JustInTimeSynthesize.__init__'
  - Line 52: function 'JustInTimeSynthesize.apply'
  - Line 146: function 'DeriveTokenAccessVectors.__init__'
  - Line 166: function 'DeriveTokenAccessVectors.applyNodeLocal'
  - Line 196: function 'DeriveTokenAccessVectors.apply'
  - Line 214: function 'LocalStretchCharacteristicFunctions.__init__'
  - Line 219: function 'LocalStretchCharacteristicFunctions.applyNodeLocal'
  - Line 311: function 'get_top_producer_period'
  - Line 329: function 'get_top_consumer_period'
  - Line 395: function 'get_nodes_until_converging'
  - Line 406: function 'get_throughput'
  - Line 428: function 'get_parent_throughput'
  - Line 439: function 'get_parent'
  - Line 449: function 'get_consumer'
  - Line 455: function 'get_consumer_throughput'
  - Line 466: function 'get_true_period'
  - Line 473: function 'get_branch_nodes'
  - Line 481: function 'get_branch_volume'
  - Line 524: function 'calculate_peak_volume_delta'
  - Line 581: function 'compute_node_latency_init_periods'
  - Line 588: function 'max_dist'
  - Line 622: function 'get_full_branch_latency'
  - Line 629: function 'assign_extra_fifo_volume'
  - Line 738: function 'HandleBranches.__init__'
  - Line 743: function 'HandleBranches.apply'
  - Line 770: function 'ProducerDelayCharacteristicFunctions.__init__'
  - Line 775: function 'ProducerDelayCharacteristicFunctions.applyNodeLocal'
  - Line 845: function 'DelayCharacteristicFunctions.__init__'
  - Line 850: function 'DelayCharacteristicFunctions.applyNodeLocal'
  - Line 932: function 'inter_token_gaps'
  - Line 951: function 'remove_trailing_duplicates_keep_one'
  - Line 966: function 'remove_leading_duplicates_keep_one'
  - Line 989: function 'DeriveFIFOSizes.__init__'
  - Line 1017: function 'DeriveFIFOSizes.apply'

📄 src/finn/util/basic.py:
  - Line 410: function 'get_driver_shapes'
  - Line 502: function 'stretch'
  - Line 510: class 'Characteristic_Node'
  - Line 511: function 'Characteristic_Node.__init__'
  - Line 520: function 'Characteristic_Node.sum'
  - Line 581: function 'compress_numpy_to_string'
  - Line 597: function 'decompress_string_to_numpy'
  - Line 609: function 'compute_total_model_fifo_size'

Total missing docstrings: 184

lstasytis and others added 7 commits February 16, 2026 10:50
Missed a check in refactoring which dramatically inflates conservative relaxation's fifo depth numbers.
The aggressive relaxation strategy was intended to pick the minimum fifo size determined between two different relaxation passes. This got lost in the refactoring and is now reinstated.
Removed commented-out print statements for debugging.
@github-actions
Copy link
Copy Markdown

📋 Docstring Check Report

Checked files:

  • src/finn/analysis/fpgadataflow/dataflow_performance.py
  • src/finn/builder/build_dataflow_config.py
  • src/finn/builder/build_dataflow_steps.py
  • src/finn/custom_op/fpgadataflow/addstreams.py
  • src/finn/custom_op/fpgadataflow/attention.py
  • src/finn/custom_op/fpgadataflow/channelwise_op.py
  • src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py
  • src/finn/custom_op/fpgadataflow/duplicatestreams.py
  • src/finn/custom_op/fpgadataflow/elementwise_binary.py
  • src/finn/custom_op/fpgadataflow/fmpadding.py
  • src/finn/custom_op/fpgadataflow/hls/attention_hls.py
  • src/finn/custom_op/fpgadataflow/hls/replicate_stream_hls.py
  • src/finn/custom_op/fpgadataflow/hlsbackend.py
  • src/finn/custom_op/fpgadataflow/hwcustomop.py
  • src/finn/custom_op/fpgadataflow/labelselect.py
  • src/finn/custom_op/fpgadataflow/matrixvectoractivation.py
  • src/finn/custom_op/fpgadataflow/pool.py
  • src/finn/custom_op/fpgadataflow/replicate_stream.py
  • src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py
  • src/finn/custom_op/fpgadataflow/thresholding.py
  • src/finn/custom_op/fpgadataflow/vectorvectoractivation.py
  • src/finn/transformation/fpgadataflow/derive_characteristic.py
  • src/finn/util/basic.py
  • tests/fpgadataflow/test_convert_to_hw_pool_batch.py
  • tests/fpgadataflow/test_fifosizing.py
  • tests/fpgadataflow/test_fpgadataflow_attention.py
  • tests/fpgadataflow/test_fpgadataflow_channelwise_ops.py
  • tests/fpgadataflow/test_fpgadataflow_convinputgenerator.py
  • tests/fpgadataflow/test_fpgadataflow_downsampler.py
  • tests/fpgadataflow/test_fpgadataflow_dwc.py
  • tests/fpgadataflow/test_fpgadataflow_fmpadding.py
  • tests/fpgadataflow/test_fpgadataflow_labelselect.py
  • tests/fpgadataflow/test_fpgadataflow_mvau.py
  • tests/fpgadataflow/test_fpgadataflow_thresholding.py
  • tests/fpgadataflow/test_fpgadataflow_vvau.py
  • tests/testing_util/test.py

Docstring check failed!

Missing Docstrings Details:

  • src/finn/analysis/fpgadataflow/dataflow_performance.py
  • src/finn/builder/build_dataflow_config.py
  • src/finn/builder/build_dataflow_steps.py
  • src/finn/custom_op/fpgadataflow/addstreams.py
  • src/finn/custom_op/fpgadataflow/attention.py
  • src/finn/custom_op/fpgadataflow/channelwise_op.py
  • src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py
  • src/finn/custom_op/fpgadataflow/duplicatestreams.py
  • src/finn/custom_op/fpgadataflow/elementwise_binary.py
  • src/finn/custom_op/fpgadataflow/fmpadding.py
  • src/finn/custom_op/fpgadataflow/hls/attention_hls.py
  • src/finn/custom_op/fpgadataflow/hls/replicate_stream_hls.py
  • src/finn/custom_op/fpgadataflow/hlsbackend.py
  • src/finn/custom_op/fpgadataflow/hwcustomop.py
  • src/finn/custom_op/fpgadataflow/labelselect.py
  • src/finn/custom_op/fpgadataflow/matrixvectoractivation.py
  • src/finn/custom_op/fpgadataflow/pool.py
  • src/finn/custom_op/fpgadataflow/replicate_stream.py
  • src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py
  • src/finn/custom_op/fpgadataflow/thresholding.py
  • src/finn/custom_op/fpgadataflow/vectorvectoractivation.py
  • src/finn/transformation/fpgadataflow/derive_characteristic.py
  • src/finn/util/basic.py

📄 src/finn/analysis/fpgadataflow/dataflow_performance.py:

    • Line 1: module 'dataflow_performance.py'

📄 src/finn/custom_op/fpgadataflow/addstreams.py:

    • Line 1: module 'addstreams.py'
    • Line 41: function 'AddStreams.init'
    • Line 44: function 'AddStreams.get_nodeattr_types'
    • Line 62: function 'AddStreams.get_normal_input_shape'
    • Line 68: function 'AddStreams.get_folded_input_shape'
    • Line 76: function 'AddStreams.get_normal_output_shape'
    • Line 79: function 'AddStreams.get_folded_output_shape'
    • Line 82: function 'AddStreams.infer_node_datatype'
    • Line 137: function 'AddStreams.get_exp_cycles'
    • Line 141: function 'AddStreams.execute_node'
    • Line 153: function 'AddStreams.prepare_tree_model'
    • Line 161: function 'AddStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/attention.py:

    • Line 1: module 'attention.py'
    • Line 31: function 'softmax'
    • Line 49: class 'ScaledDotProductAttention'
    • Line 51: function 'ScaledDotProductAttention.init'
    • Line 56: function 'ScaledDotProductAttention.get_nodeattr_types'
    • Line 172: function 'ScaledDotProductAttention.shapes'
    • Line 180: function 'ScaledDotProductAttention.folds'
    • Line 188: function 'ScaledDotProductAttention.is_valid_folding'
    • Line 200: function 'ScaledDotProductAttention.iterations'
    • Line 207: function 'ScaledDotProductAttention.make_shape_compatible_op'
    • Line 226: function 'ScaledDotProductAttention.infer_node_datatype'
    • Line 287: function 'ScaledDotProductAttention._execute_node_python'
    • Line 299: function 'ScaledDotProductAttention.act_qk_matmul'
    • Line 316: function 'ScaledDotProductAttention.act_a_softmax'
    • Line 334: function 'ScaledDotProductAttention.act_av_matmul'
    • Line 410: function 'ScaledDotProductAttention._execute_node_cppsim'
    • Line 417: function 'ScaledDotProductAttention._execute_node_rtlsim'
    • Line 424: function 'ScaledDotProductAttention.execute_node'
    • Line 434: function 'ScaledDotProductAttention.verify_node'
    • Line 438: function 'ScaledDotProductAttention.get_input_datatype'
    • Line 477: function 'ScaledDotProductAttention.get_output_datatype'
    • Line 484: function 'ScaledDotProductAttention.get_normal_input_shape'
    • Line 533: function 'ScaledDotProductAttention.get_normal_output_shape'
    • Line 541: function 'ScaledDotProductAttention.get_normal_attention_shape'
    • Line 547: function 'ScaledDotProductAttention.get_folded_input_shape'
    • Line 579: function 'ScaledDotProductAttention.get_folded_output_shape'
    • Line 590: function 'ScaledDotProductAttention.get_folded_attention_shape'
    • Line 600: function 'ScaledDotProductAttention.get_instream_width'
    • Line 619: function 'ScaledDotProductAttention.get_outstream_width'
    • Line 629: function 'ScaledDotProductAttention.minimize_accumulator_width'
    • Line 716: function 'ScaledDotProductAttention.get_number_input_values'
    • Line 723: function 'ScaledDotProductAttention.get_number_output_values'
    • Line 733: function 'ScaledDotProductAttention.get_input_name_by_name'
    • Line 772: function 'ScaledDotProductAttention.get_exp_cycles'

📄 src/finn/custom_op/fpgadataflow/channelwise_op.py:

    • Line 1: module 'channelwise_op.py'
    • Line 80: function 'ChannelwiseOp.init'
    • Line 83: function 'ChannelwiseOp.get_nodeattr_types'
    • Line 112: function 'ChannelwiseOp.infer_node_datatype'
    • Line 162: function 'ChannelwiseOp.get_instream_width'
    • Line 172: function 'ChannelwiseOp.get_outstream_width'
    • Line 176: function 'ChannelwiseOp.get_folded_input_shape'
    • Line 189: function 'ChannelwiseOp.get_folded_output_shape'
    • Line 193: function 'ChannelwiseOp.get_normal_input_shape'
    • Line 206: function 'ChannelwiseOp.get_normal_output_shape'
    • Line 210: function 'ChannelwiseOp.get_exp_cycles'
    • Line 214: function 'ChannelwiseOp.execute_node'
    • Line 245: function 'ChannelwiseOp.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py:

    • Line 1: module 'convolutioninputgenerator.py'
    • Line 50: function 'ConvolutionInputGenerator.init'
    • Line 53: function 'ConvolutionInputGenerator.get_nodeattr_types'
    • Line 88: function 'ConvolutionInputGenerator.get_normal_input_shape'
    • Line 94: function 'ConvolutionInputGenerator.get_folded_input_shape'
    • Line 103: function 'ConvolutionInputGenerator.get_normal_output_shape'
    • Line 115: function 'ConvolutionInputGenerator.get_folded_output_shape'
    • Line 134: function 'ConvolutionInputGenerator.infer_node_datatype'
    • Line 179: function 'ConvolutionInputGenerator.get_outstream_width'
    • Line 188: function 'ConvolutionInputGenerator.get_1d_conv_attrs_normalized'
    • Line 214: function 'ConvolutionInputGenerator.get_exp_cycles'
    • Line 217: function 'ConvolutionInputGenerator.bram_estimation'
    • Line 220: function 'ConvolutionInputGenerator.lut_estimation'
    • Line 223: function 'ConvolutionInputGenerator.uram_estimation'
    • Line 226: function 'ConvolutionInputGenerator.execute_node'
    • Line 265: function 'ConvolutionInputGenerator.get_tree_model_uniform_distribution_based'
    • Line 266: function 'ConvolutionInputGenerator.distribute_outputs_uniform'
    • Line 563: function 'ConvolutionInputGenerator.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/duplicatestreams.py:

    • Line 1: module 'duplicatestreams.py'
    • Line 40: function 'DuplicateStreams.init'
    • Line 43: function 'DuplicateStreams.get_nodeattr_types'
    • Line 60: function 'DuplicateStreams.get_num_output_streams'
    • Line 63: function 'DuplicateStreams.get_normal_input_shape'
    • Line 69: function 'DuplicateStreams.get_folded_input_shape'
    • Line 78: function 'DuplicateStreams.get_normal_output_shape'
    • Line 83: function 'DuplicateStreams.get_folded_output_shape'
    • Line 88: function 'DuplicateStreams.make_shape_compatible_op'
    • Line 93: function 'DuplicateStreams.infer_node_datatype'
    • Line 130: function 'DuplicateStreams.get_number_output_values'
    • Line 136: function 'DuplicateStreams.get_exp_cycles'
    • Line 140: function 'DuplicateStreams.execute_node'
    • Line 152: function 'DuplicateStreams.get_tree_model'
    • Line 162: function 'DuplicateStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/elementwise_binary.py:

    • Line 1: module 'elementwise_binary.py'
    • Line 44: class 'ElementwiseBinaryOperation'
    • Line 51: function 'ElementwiseBinaryOperation.npy_op'
    • Line 56: function 'ElementwiseBinaryOperation.cpp_op'
    • Line 61: function 'ElementwiseBinaryOperation.rtl_op'
    • Line 65: function 'ElementwiseBinaryOperation.init'
    • Line 70: function 'ElementwiseBinaryOperation.get_nodeattr_types'
    • Line 119: function 'ElementwiseBinaryOperation.lhs_dtype'
    • Line 125: function 'ElementwiseBinaryOperation.rhs_dtype'
    • Line 131: function 'ElementwiseBinaryOperation.out_dtype'
    • Line 137: function 'ElementwiseBinaryOperation.lhs_shape'
    • Line 142: function 'ElementwiseBinaryOperation.rhs_shape'
    • Line 147: function 'ElementwiseBinaryOperation.out_shape'
    • Line 152: function 'ElementwiseBinaryOperation.lhs_style'
    • Line 157: function 'ElementwiseBinaryOperation.rhs_style'
    • Line 162: function 'ElementwiseBinaryOperation.pe'
    • Line 167: function 'ElementwiseBinaryOperation.broadcast_last_axis'
    • Line 173: function 'ElementwiseBinaryOperation.make_shape_compatible_op'
    • Line 193: function 'ElementwiseBinaryOperation.infer_node_datatype'
    • Line 215: function 'ElementwiseBinaryOperation.execute_node'
    • Line 240: function 'ElementwiseBinaryOperation.get_input_datatype'
    • Line 245: function 'ElementwiseBinaryOperation.get_output_datatype'
    • Line 250: function 'ElementwiseBinaryOperation.get_normal_input_shape'
    • Line 255: function 'ElementwiseBinaryOperation.get_normal_output_shape'
    • Line 260: function 'ElementwiseBinaryOperation.get_folded_input_shape'
    • Line 274: function 'ElementwiseBinaryOperation.get_folded_output_shape'
    • Line 288: function 'ElementwiseBinaryOperation.get_instream_width'
    • Line 310: function 'ElementwiseBinaryOperation.get_outstream_width'
    • Line 321: function 'ElementwiseBinaryOperation.minimize_accumulator_width'
    • Line 344: function 'ElementwiseBinaryOperation._derive_out_dtype'
    • Line 353: function 'ElementwiseBinaryOperation.minimize_weight_bit_width'
    • Line 437: function 'ElementwiseBinaryOperation.get_exp_cycles'
    • Line 445: class 'ElementwiseAdd'
    • Line 451: function 'ElementwiseAdd._derive_out_dtype'
    • Line 485: class 'ElementwiseSub'
    • Line 491: function 'ElementwiseSub._derive_out_dtype'
    • Line 521: class 'ElementwiseMul'
    • Line 527: function 'ElementwiseMul._derive_out_dtype'
    • Line 542: class 'ElementwiseDiv'
    • Line 549: function 'ElementwiseDiv._derive_out_dtype'
    • Line 568: class 'ElementwiseAnd'
    • Line 574: function 'ElementwiseAnd._derive_out_dtype'
    • Line 582: class 'ElementwiseOr'
    • Line 588: function 'ElementwiseOr._derive_out_dtype'
    • Line 596: class 'ElementwiseXor'
    • Line 602: function 'ElementwiseXor._derive_out_dtype'
    • Line 610: class 'ElementwiseEqual'
    • Line 616: function 'ElementwiseEqual._derive_out_dtype'
    • Line 624: class 'ElementwiseLess'
    • Line 630: function 'ElementwiseLess._derive_out_dtype'
    • Line 638: class 'ElementwiseLessOrEqual'
    • Line 644: function 'ElementwiseLessOrEqual._derive_out_dtype'
    • Line 652: class 'ElementwiseGreater'
    • Line 658: function 'ElementwiseGreater._derive_out_dtype'
    • Line 667: class 'ElementwiseGreaterOrEqual'
    • Line 673: function 'ElementwiseGreaterOrEqual._derive_out_dtype'
    • Line 681: class 'ElementwiseBitwiseAnd'
    • Line 687: function 'ElementwiseBitwiseAnd._derive_out_dtype'
    • Line 703: class 'ElementwiseBitwiseOr'
    • Line 709: function 'ElementwiseBitwiseOr._derive_out_dtype'
    • Line 725: class 'ElementwiseBitwiseXor'
    • Line 731: function 'ElementwiseBitwiseXor._derive_out_dtype'
    • Line 747: class 'ElementwiseBitShift'
    • Line 749: function 'ElementwiseBitShift.get_nodeattr_types'
    • Line 763: function 'ElementwiseBitShift.npy_op'
    • Line 768: function 'ElementwiseBitShift.cpp_op'
    • Line 773: function 'ElementwiseBitShift.rtl_op'
    • Line 777: function 'ElementwiseBitShift._derive_out_dtype'
    • Line 794: class 'ElementwiseMax'
    • Line 796: function 'ElementwiseMax.npy_op'
    • Line 801: function 'ElementwiseMax.cpp_op'
    • Line 807: function 'ElementwiseMax.rtl_op'
    • Line 810: function 'ElementwiseMax._derive_out_dtype'

📄 src/finn/custom_op/fpgadataflow/fmpadding.py:

    • Line 1: module 'fmpadding.py'
    • Line 41: function 'FMPadding.init'
    • Line 44: function 'FMPadding.get_nodeattr_types'
    • Line 76: function 'FMPadding.get_exp_cycles'
    • Line 84: function 'FMPadding.get_normal_input_shape'
    • Line 90: function 'FMPadding.get_normal_output_shape'
    • Line 97: function 'FMPadding.get_folded_input_shape'
    • Line 106: function 'FMPadding.get_folded_output_shape'
    • Line 115: function 'FMPadding.make_shape_compatible_op'
    • Line 122: function 'FMPadding.infer_node_datatype'
    • Line 135: function 'FMPadding.verify_node'
    • Line 150: function 'FMPadding.get_instream_width'
    • Line 155: function 'FMPadding.get_outstream_width'
    • Line 160: function 'FMPadding.get_number_output_values'
    • Line 164: function 'FMPadding.execute_node'
    • Line 175: function 'FMPadding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/hls/replicate_stream_hls.py:

    • Line 1: module 'replicate_stream_hls.py'
    • Line 15: class 'ReplicateStream_hls'
    • Line 20: function 'ReplicateStream_hls.get_nodeattr_types'
    • Line 30: function 'ReplicateStream_hls.get_ap_int_max_w'
    • Line 46: function 'ReplicateStream_hls.global_includes'
    • Line 51: function 'ReplicateStream_hls.defines'
    • Line 74: function 'ReplicateStream_hls.docompute'
    • Line 76: function 'ReplicateStream_hls.out'
    • Line 100: function 'ReplicateStream_hls.blackboxfunction'
    • Line 119: function 'ReplicateStream_hls.pragmas'
    • Line 138: function 'ReplicateStream_hls.get_verilog_top_module_intf_names'

📄 src/finn/custom_op/fpgadataflow/hwcustomop.py:

    • Line 1: module 'hwcustomop.py'
    • Line 47: function 'HWCustomOp.init'
    • Line 51: function 'HWCustomOp.get_nodeattr_types'
    • Line 102: function 'HWCustomOp.make_shape_compatible_op'
    • Line 313: function 'HWCustomOp.derive_token_access_vectors'
    • Line 343: function 'HWCustomOp.derive_token_access_vectors_using_tree_model'
    • Line 510: function 'HWCustomOp.generate_hdl_dynload'
    • Line 619: function 'HWCustomOp.accumulate_char_fxn'

📄 src/finn/custom_op/fpgadataflow/labelselect.py:

    • Line 1: module 'labelselect.py'
    • Line 41: function 'LabelSelect.init'
    • Line 55: function 'LabelSelect.get_nodeattr_types'
    • Line 72: function 'LabelSelect.get_normal_input_shape'
    • Line 78: function 'LabelSelect.get_folded_input_shape'
    • Line 87: function 'LabelSelect.get_normal_output_shape'
    • Line 93: function 'LabelSelect.get_folded_output_shape'
    • Line 99: function 'LabelSelect.make_shape_compatible_op'
    • Line 114: function 'LabelSelect.infer_node_datatype'
    • Line 123: function 'LabelSelect.verify_node'
    • Line 147: function 'LabelSelect.get_number_output_values'
    • Line 150: function 'LabelSelect.execute_node'
    • Line 180: function 'LabelSelect.get_exp_cycles'
    • Line 187: function 'LabelSelect.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/matrixvectoractivation.py:

    • Line 1: module 'matrixvectoractivation.py'
    • Line 58: function 'MVAU.init'
    • Line 61: function 'MVAU.get_nodeattr_types'
    • Line 134: function 'MVAU.execute_node'
    • Line 176: function 'MVAU.verify_node'
    • Line 231: function 'MVAU.infer_node_datatype'
    • Line 265: function 'MVAU.get_instream_width'
    • Line 298: function 'MVAU.get_outstream_width'
    • Line 303: function 'MVAU.get_folded_input_shape'
    • Line 329: function 'MVAU.get_folded_output_shape'
    • Line 337: function 'MVAU.get_normal_input_shape'
    • Line 349: function 'MVAU.get_normal_output_shape'
    • Line 375: function 'MVAU.uram_estimation'
    • Line 437: function 'MVAU.bram_efficiency_estimation'
    • Line 463: function 'MVAU.get_exp_cycles'
    • Line 788: function 'MVAU.generate_params'
    • Line 863: function 'MVAU.get_op_and_param_counts'
    • Line 887: function 'MVAU.get_verilog_top_module_intf_names'
    • Line 913: function 'MVAU.code_generation_ipi'
    • Line 1098: function 'MVAU.get_tree_model'
    • Line 1147: function 'MVAU.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/pool.py:

    • Line 233: function 'Pool.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/replicate_stream.py:

    • Line 1: module 'replicate_stream.py'
    • Line 27: class 'ReplicateStream'
    • Line 29: function 'ReplicateStream.init'
    • Line 40: function 'ReplicateStream.get_nodeattr_types'
    • Line 70: function 'ReplicateStream.num'
    • Line 75: function 'ReplicateStream.dtype'
    • Line 81: function 'ReplicateStream.num_elems'
    • Line 86: function 'ReplicateStream.pe'
    • Line 91: function 'ReplicateStream.num_inputs'
    • Line 97: function 'ReplicateStream.make_shape_compatible_op'
    • Line 113: function 'ReplicateStream.infer_node_datatype'
    • Line 132: function 'ReplicateStream._execute_node_python'
    • Line 143: function 'ReplicateStream._execute_node_cppsim'
    • Line 150: function 'ReplicateStream.execute_node'
    • Line 160: function 'ReplicateStream.verify_node'
    • Line 167: function 'ReplicateStream.get_input_datatype'
    • Line 172: function 'ReplicateStream.get_output_datatype'
    • Line 177: function 'ReplicateStream.get_normal_input_shape'
    • Line 183: function 'ReplicateStream.get_normal_output_shape'
    • Line 189: function 'ReplicateStream.get_folded_input_shape'
    • Line 196: function 'ReplicateStream.get_folded_output_shape'
    • Line 203: function 'ReplicateStream.get_instream_width'
    • Line 213: function 'ReplicateStream.get_outstream_width'
    • Line 224: function 'ReplicateStream.get_number_output_values'
    • Line 237: function 'ReplicateStream.get_exp_cycles'

📄 src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py:

    • Line 1: module 'streamingdatawidthconverter.py'
    • Line 44: function 'StreamingDataWidthConverter.get_nodeattr_types'
    • Line 68: function 'StreamingDataWidthConverter.get_normal_input_shape'
    • Line 72: function 'StreamingDataWidthConverter.get_normal_output_shape'
    • Line 76: function 'StreamingDataWidthConverter.get_iowidth_lcm'
    • Line 81: function 'StreamingDataWidthConverter.needs_lcm'
    • Line 88: function 'StreamingDataWidthConverter.check_divisible_iowidths'
    • Line 91: function 'StreamingDataWidthConverter.get_folded_input_shape'
    • Line 111: function 'StreamingDataWidthConverter.get_folded_output_shape'
    • Line 132: function 'StreamingDataWidthConverter.get_number_input_values'
    • Line 136: function 'StreamingDataWidthConverter.get_number_output_values'
    • Line 140: function 'StreamingDataWidthConverter.get_instream_width'
    • Line 144: function 'StreamingDataWidthConverter.get_outstream_width'
    • Line 148: function 'StreamingDataWidthConverter.infer_node_datatype'
    • Line 162: function 'StreamingDataWidthConverter.verify_node'
    • Line 179: function 'StreamingDataWidthConverter.execute_node'
    • Line 190: function 'StreamingDataWidthConverter.get_exp_cycles'
    • Line 222: function 'StreamingDataWidthConverter.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/thresholding.py:

    • Line 384: function 'Thresholding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/vectorvectoractivation.py:

    • Line 1067: function 'VVAU.get_tree_model'
    • Line 1122: function 'VVAU.derive_token_access_vectors'

📄 src/finn/transformation/fpgadataflow/derive_characteristic.py:

    • Line 1: module 'derive_characteristic.py'
    • Line 45: class 'JustInTimeSynthesize'
    • Line 46: function 'JustInTimeSynthesize.init'
    • Line 52: function 'JustInTimeSynthesize.apply'
    • Line 146: function 'DeriveTokenAccessVectors.init'
    • Line 166: function 'DeriveTokenAccessVectors.applyNodeLocal'
    • Line 196: function 'DeriveTokenAccessVectors.apply'
    • Line 214: function 'LocalStretchCharacteristicFunctions.init'
    • Line 219: function 'LocalStretchCharacteristicFunctions.applyNodeLocal'
    • Line 311: function 'get_top_producer_period'
    • Line 329: function 'get_top_consumer_period'
    • Line 395: function 'get_nodes_until_converging'
    • Line 406: function 'get_throughput'
    • Line 428: function 'get_parent_throughput'
    • Line 439: function 'get_parent'
    • Line 449: function 'get_consumer'
    • Line 455: function 'get_consumer_throughput'
    • Line 466: function 'get_true_period'
    • Line 473: function 'get_branch_nodes'
    • Line 481: function 'get_branch_volume'
    • Line 524: function 'calculate_peak_volume_delta'
    • Line 581: function 'compute_node_latency_init_periods'
    • Line 588: function 'max_dist'
    • Line 622: function 'get_full_branch_latency'
    • Line 629: function 'assign_extra_fifo_volume'
    • Line 738: function 'HandleBranches.init'
    • Line 743: function 'HandleBranches.apply'
    • Line 770: function 'ProducerDelayCharacteristicFunctions.init'
    • Line 775: function 'ProducerDelayCharacteristicFunctions.applyNodeLocal'
    • Line 845: function 'DelayCharacteristicFunctions.init'
    • Line 850: function 'DelayCharacteristicFunctions.applyNodeLocal'
    • Line 932: function 'inter_token_gaps'
    • Line 951: function 'remove_trailing_duplicates_keep_one'
    • Line 966: function 'remove_leading_duplicates_keep_one'
    • Line 989: function 'DeriveFIFOSizes.init'
    • Line 1017: function 'DeriveFIFOSizes.apply'

📄 src/finn/util/basic.py:

    • Line 410: function 'get_driver_shapes'
    • Line 502: function 'stretch'
    • Line 510: class 'Characteristic_Node'
    • Line 511: function 'Characteristic_Node.init'
    • Line 520: function 'Characteristic_Node.sum'
    • Line 581: function 'compress_numpy_to_string'
    • Line 597: function 'decompress_string_to_numpy'
    • Line 609: function 'compute_total_model_fifo_size'

Total missing docstrings: 327

How to Fix:

Please add docstrings to the missing functions, classes, and modules listed above.

Docstring Guidelines:

  • All modules should have a module-level docstring
  • All public functions and methods should have docstrings
  • All private functions should have docstrings
  • All classes should have docstrings
  • Use triple quotes (""") for docstrings
  • Follow PEP 257 conventions
Raw output from docstring checker
Checking 23 specified Python file(s) (excluding tests folder):
  - src/finn/analysis/fpgadataflow/dataflow_performance.py
  - src/finn/builder/build_dataflow_config.py
  - src/finn/builder/build_dataflow_steps.py
  - src/finn/custom_op/fpgadataflow/addstreams.py
  - src/finn/custom_op/fpgadataflow/attention.py
  - src/finn/custom_op/fpgadataflow/channelwise_op.py
  - src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py
  - src/finn/custom_op/fpgadataflow/duplicatestreams.py
  - src/finn/custom_op/fpgadataflow/elementwise_binary.py
  - src/finn/custom_op/fpgadataflow/fmpadding.py
  - src/finn/custom_op/fpgadataflow/hls/attention_hls.py
  - src/finn/custom_op/fpgadataflow/hls/replicate_stream_hls.py
  - src/finn/custom_op/fpgadataflow/hlsbackend.py
  - src/finn/custom_op/fpgadataflow/hwcustomop.py
  - src/finn/custom_op/fpgadataflow/labelselect.py
  - src/finn/custom_op/fpgadataflow/matrixvectoractivation.py
  - src/finn/custom_op/fpgadataflow/pool.py
  - src/finn/custom_op/fpgadataflow/replicate_stream.py
  - src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py
  - src/finn/custom_op/fpgadataflow/thresholding.py
  - src/finn/custom_op/fpgadataflow/vectorvectoractivation.py
  - src/finn/transformation/fpgadataflow/derive_characteristic.py
  - src/finn/util/basic.py

❌ Missing docstrings found:

📄 src/finn/analysis/fpgadataflow/dataflow_performance.py:
  - Line 1: module 'dataflow_performance.py'

📄 src/finn/custom_op/fpgadataflow/addstreams.py:
  - Line 1: module 'addstreams.py'
  - Line 41: function 'AddStreams.__init__'
  - Line 44: function 'AddStreams.get_nodeattr_types'
  - Line 62: function 'AddStreams.get_normal_input_shape'
  - Line 68: function 'AddStreams.get_folded_input_shape'
  - Line 76: function 'AddStreams.get_normal_output_shape'
  - Line 79: function 'AddStreams.get_folded_output_shape'
  - Line 82: function 'AddStreams.infer_node_datatype'
  - Line 137: function 'AddStreams.get_exp_cycles'
  - Line 141: function 'AddStreams.execute_node'
  - Line 153: function 'AddStreams.prepare_tree_model'
  - Line 161: function 'AddStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/attention.py:
  - Line 1: module 'attention.py'
  - Line 31: function 'softmax'
  - Line 49: class 'ScaledDotProductAttention'
  - Line 51: function 'ScaledDotProductAttention.__init__'
  - Line 56: function 'ScaledDotProductAttention.get_nodeattr_types'
  - Line 172: function 'ScaledDotProductAttention.shapes'
  - Line 180: function 'ScaledDotProductAttention.folds'
  - Line 188: function 'ScaledDotProductAttention.is_valid_folding'
  - Line 200: function 'ScaledDotProductAttention.iterations'
  - Line 207: function 'ScaledDotProductAttention.make_shape_compatible_op'
  - Line 226: function 'ScaledDotProductAttention.infer_node_datatype'
  - Line 287: function 'ScaledDotProductAttention._execute_node_python'
  - Line 299: function 'ScaledDotProductAttention.act_qk_matmul'
  - Line 316: function 'ScaledDotProductAttention.act_a_softmax'
  - Line 334: function 'ScaledDotProductAttention.act_av_matmul'
  - Line 410: function 'ScaledDotProductAttention._execute_node_cppsim'
  - Line 417: function 'ScaledDotProductAttention._execute_node_rtlsim'
  - Line 424: function 'ScaledDotProductAttention.execute_node'
  - Line 434: function 'ScaledDotProductAttention.verify_node'
  - Line 438: function 'ScaledDotProductAttention.get_input_datatype'
  - Line 477: function 'ScaledDotProductAttention.get_output_datatype'
  - Line 484: function 'ScaledDotProductAttention.get_normal_input_shape'
  - Line 533: function 'ScaledDotProductAttention.get_normal_output_shape'
  - Line 541: function 'ScaledDotProductAttention.get_normal_attention_shape'
  - Line 547: function 'ScaledDotProductAttention.get_folded_input_shape'
  - Line 579: function 'ScaledDotProductAttention.get_folded_output_shape'
  - Line 590: function 'ScaledDotProductAttention.get_folded_attention_shape'
  - Line 600: function 'ScaledDotProductAttention.get_instream_width'
  - Line 619: function 'ScaledDotProductAttention.get_outstream_width'
  - Line 629: function 'ScaledDotProductAttention.minimize_accumulator_width'
  - Line 716: function 'ScaledDotProductAttention.get_number_input_values'
  - Line 723: function 'ScaledDotProductAttention.get_number_output_values'
  - Line 733: function 'ScaledDotProductAttention.get_input_name_by_name'
  - Line 772: function 'ScaledDotProductAttention.get_exp_cycles'

📄 src/finn/custom_op/fpgadataflow/channelwise_op.py:
  - Line 1: module 'channelwise_op.py'
  - Line 80: function 'ChannelwiseOp.__init__'
  - Line 83: function 'ChannelwiseOp.get_nodeattr_types'
  - Line 112: function 'ChannelwiseOp.infer_node_datatype'
  - Line 162: function 'ChannelwiseOp.get_instream_width'
  - Line 172: function 'ChannelwiseOp.get_outstream_width'
  - Line 176: function 'ChannelwiseOp.get_folded_input_shape'
  - Line 189: function 'ChannelwiseOp.get_folded_output_shape'
  - Line 193: function 'ChannelwiseOp.get_normal_input_shape'
  - Line 206: function 'ChannelwiseOp.get_normal_output_shape'
  - Line 210: function 'ChannelwiseOp.get_exp_cycles'
  - Line 214: function 'ChannelwiseOp.execute_node'
  - Line 245: function 'ChannelwiseOp.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py:
  - Line 1: module 'convolutioninputgenerator.py'
  - Line 50: function 'ConvolutionInputGenerator.__init__'
  - Line 53: function 'ConvolutionInputGenerator.get_nodeattr_types'
  - Line 88: function 'ConvolutionInputGenerator.get_normal_input_shape'
  - Line 94: function 'ConvolutionInputGenerator.get_folded_input_shape'
  - Line 103: function 'ConvolutionInputGenerator.get_normal_output_shape'
  - Line 115: function 'ConvolutionInputGenerator.get_folded_output_shape'
  - Line 134: function 'ConvolutionInputGenerator.infer_node_datatype'
  - Line 179: function 'ConvolutionInputGenerator.get_outstream_width'
  - Line 188: function 'ConvolutionInputGenerator.get_1d_conv_attrs_normalized'
  - Line 214: function 'ConvolutionInputGenerator.get_exp_cycles'
  - Line 217: function 'ConvolutionInputGenerator.bram_estimation'
  - Line 220: function 'ConvolutionInputGenerator.lut_estimation'
  - Line 223: function 'ConvolutionInputGenerator.uram_estimation'
  - Line 226: function 'ConvolutionInputGenerator.execute_node'
  - Line 265: function 'ConvolutionInputGenerator.get_tree_model_uniform_distribution_based'
  - Line 266: function 'ConvolutionInputGenerator.distribute_outputs_uniform'
  - Line 563: function 'ConvolutionInputGenerator.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/duplicatestreams.py:
  - Line 1: module 'duplicatestreams.py'
  - Line 40: function 'DuplicateStreams.__init__'
  - Line 43: function 'DuplicateStreams.get_nodeattr_types'
  - Line 60: function 'DuplicateStreams.get_num_output_streams'
  - Line 63: function 'DuplicateStreams.get_normal_input_shape'
  - Line 69: function 'DuplicateStreams.get_folded_input_shape'
  - Line 78: function 'DuplicateStreams.get_normal_output_shape'
  - Line 83: function 'DuplicateStreams.get_folded_output_shape'
  - Line 88: function 'DuplicateStreams.make_shape_compatible_op'
  - Line 93: function 'DuplicateStreams.infer_node_datatype'
  - Line 130: function 'DuplicateStreams.get_number_output_values'
  - Line 136: function 'DuplicateStreams.get_exp_cycles'
  - Line 140: function 'DuplicateStreams.execute_node'
  - Line 152: function 'DuplicateStreams.get_tree_model'
  - Line 162: function 'DuplicateStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/elementwise_binary.py:
  - Line 1: module 'elementwise_binary.py'
  - Line 44: class 'ElementwiseBinaryOperation'
  - Line 51: function 'ElementwiseBinaryOperation.npy_op'
  - Line 56: function 'ElementwiseBinaryOperation.cpp_op'
  - Line 61: function 'ElementwiseBinaryOperation.rtl_op'
  - Line 65: function 'ElementwiseBinaryOperation.__init__'
  - Line 70: function 'ElementwiseBinaryOperation.get_nodeattr_types'
  - Line 119: function 'ElementwiseBinaryOperation.lhs_dtype'
  - Line 125: function 'ElementwiseBinaryOperation.rhs_dtype'
  - Line 131: function 'ElementwiseBinaryOperation.out_dtype'
  - Line 137: function 'ElementwiseBinaryOperation.lhs_shape'
  - Line 142: function 'ElementwiseBinaryOperation.rhs_shape'
  - Line 147: function 'ElementwiseBinaryOperation.out_shape'
  - Line 152: function 'ElementwiseBinaryOperation.lhs_style'
  - Line 157: function 'ElementwiseBinaryOperation.rhs_style'
  - Line 162: function 'ElementwiseBinaryOperation.pe'
  - Line 167: function 'ElementwiseBinaryOperation.broadcast_last_axis'
  - Line 173: function 'ElementwiseBinaryOperation.make_shape_compatible_op'
  - Line 193: function 'ElementwiseBinaryOperation.infer_node_datatype'
  - Line 215: function 'ElementwiseBinaryOperation.execute_node'
  - Line 240: function 'ElementwiseBinaryOperation.get_input_datatype'
  - Line 245: function 'ElementwiseBinaryOperation.get_output_datatype'
  - Line 250: function 'ElementwiseBinaryOperation.get_normal_input_shape'
  - Line 255: function 'ElementwiseBinaryOperation.get_normal_output_shape'
  - Line 260: function 'ElementwiseBinaryOperation.get_folded_input_shape'
  - Line 274: function 'ElementwiseBinaryOperation.get_folded_output_shape'
  - Line 288: function 'ElementwiseBinaryOperation.get_instream_width'
  - Line 310: function 'ElementwiseBinaryOperation.get_outstream_width'
  - Line 321: function 'ElementwiseBinaryOperation.minimize_accumulator_width'
  - Line 344: function 'ElementwiseBinaryOperation._derive_out_dtype'
  - Line 353: function 'ElementwiseBinaryOperation.minimize_weight_bit_width'
  - Line 437: function 'ElementwiseBinaryOperation.get_exp_cycles'
  - Line 445: class 'ElementwiseAdd'
  - Line 451: function 'ElementwiseAdd._derive_out_dtype'
  - Line 485: class 'ElementwiseSub'
  - Line 491: function 'ElementwiseSub._derive_out_dtype'
  - Line 521: class 'ElementwiseMul'
  - Line 527: function 'ElementwiseMul._derive_out_dtype'
  - Line 542: class 'ElementwiseDiv'
  - Line 549: function 'ElementwiseDiv._derive_out_dtype'
  - Line 568: class 'ElementwiseAnd'
  - Line 574: function 'ElementwiseAnd._derive_out_dtype'
  - Line 582: class 'ElementwiseOr'
  - Line 588: function 'ElementwiseOr._derive_out_dtype'
  - Line 596: class 'ElementwiseXor'
  - Line 602: function 'ElementwiseXor._derive_out_dtype'
  - Line 610: class 'ElementwiseEqual'
  - Line 616: function 'ElementwiseEqual._derive_out_dtype'
  - Line 624: class 'ElementwiseLess'
  - Line 630: function 'ElementwiseLess._derive_out_dtype'
  - Line 638: class 'ElementwiseLessOrEqual'
  - Line 644: function 'ElementwiseLessOrEqual._derive_out_dtype'
  - Line 652: class 'ElementwiseGreater'
  - Line 658: function 'ElementwiseGreater._derive_out_dtype'
  - Line 667: class 'ElementwiseGreaterOrEqual'
  - Line 673: function 'ElementwiseGreaterOrEqual._derive_out_dtype'
  - Line 681: class 'ElementwiseBitwiseAnd'
  - Line 687: function 'ElementwiseBitwiseAnd._derive_out_dtype'
  - Line 703: class 'ElementwiseBitwiseOr'
  - Line 709: function 'ElementwiseBitwiseOr._derive_out_dtype'
  - Line 725: class 'ElementwiseBitwiseXor'
  - Line 731: function 'ElementwiseBitwiseXor._derive_out_dtype'
  - Line 747: class 'ElementwiseBitShift'
  - Line 749: function 'ElementwiseBitShift.get_nodeattr_types'
  - Line 763: function 'ElementwiseBitShift.npy_op'
  - Line 768: function 'ElementwiseBitShift.cpp_op'
  - Line 773: function 'ElementwiseBitShift.rtl_op'
  - Line 777: function 'ElementwiseBitShift._derive_out_dtype'
  - Line 794: class 'ElementwiseMax'
  - Line 796: function 'ElementwiseMax.npy_op'
  - Line 801: function 'ElementwiseMax.cpp_op'
  - Line 807: function 'ElementwiseMax.rtl_op'
  - Line 810: function 'ElementwiseMax._derive_out_dtype'

📄 src/finn/custom_op/fpgadataflow/fmpadding.py:
  - Line 1: module 'fmpadding.py'
  - Line 41: function 'FMPadding.__init__'
  - Line 44: function 'FMPadding.get_nodeattr_types'
  - Line 76: function 'FMPadding.get_exp_cycles'
  - Line 84: function 'FMPadding.get_normal_input_shape'
  - Line 90: function 'FMPadding.get_normal_output_shape'
  - Line 97: function 'FMPadding.get_folded_input_shape'
  - Line 106: function 'FMPadding.get_folded_output_shape'
  - Line 115: function 'FMPadding.make_shape_compatible_op'
  - Line 122: function 'FMPadding.infer_node_datatype'
  - Line 135: function 'FMPadding.verify_node'
  - Line 150: function 'FMPadding.get_instream_width'
  - Line 155: function 'FMPadding.get_outstream_width'
  - Line 160: function 'FMPadding.get_number_output_values'
  - Line 164: function 'FMPadding.execute_node'
  - Line 175: function 'FMPadding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/hls/replicate_stream_hls.py:
  - Line 1: module 'replicate_stream_hls.py'
  - Line 15: class 'ReplicateStream_hls'
  - Line 20: function 'ReplicateStream_hls.get_nodeattr_types'
  - Line 30: function 'ReplicateStream_hls.get_ap_int_max_w'
  - Line 46: function 'ReplicateStream_hls.global_includes'
  - Line 51: function 'ReplicateStream_hls.defines'
  - Line 74: function 'ReplicateStream_hls.docompute'
  - Line 76: function 'ReplicateStream_hls.out'
  - Line 100: function 'ReplicateStream_hls.blackboxfunction'
  - Line 119: function 'ReplicateStream_hls.pragmas'
  - Line 138: function 'ReplicateStream_hls.get_verilog_top_module_intf_names'

📄 src/finn/custom_op/fpgadataflow/hwcustomop.py:
  - Line 1: module 'hwcustomop.py'
  - Line 47: function 'HWCustomOp.__init__'
  - Line 51: function 'HWCustomOp.get_nodeattr_types'
  - Line 102: function 'HWCustomOp.make_shape_compatible_op'
  - Line 313: function 'HWCustomOp.derive_token_access_vectors'
  - Line 343: function 'HWCustomOp.derive_token_access_vectors_using_tree_model'
  - Line 510: function 'HWCustomOp.generate_hdl_dynload'
  - Line 619: function 'HWCustomOp.accumulate_char_fxn'

📄 src/finn/custom_op/fpgadataflow/labelselect.py:
  - Line 1: module 'labelselect.py'
  - Line 41: function 'LabelSelect.__init__'
  - Line 55: function 'LabelSelect.get_nodeattr_types'
  - Line 72: function 'LabelSelect.get_normal_input_shape'
  - Line 78: function 'LabelSelect.get_folded_input_shape'
  - Line 87: function 'LabelSelect.get_normal_output_shape'
  - Line 93: function 'LabelSelect.get_folded_output_shape'
  - Line 99: function 'LabelSelect.make_shape_compatible_op'
  - Line 114: function 'LabelSelect.infer_node_datatype'
  - Line 123: function 'LabelSelect.verify_node'
  - Line 147: function 'LabelSelect.get_number_output_values'
  - Line 150: function 'LabelSelect.execute_node'
  - Line 180: function 'LabelSelect.get_exp_cycles'
  - Line 187: function 'LabelSelect.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/matrixvectoractivation.py:
  - Line 1: module 'matrixvectoractivation.py'
  - Line 58: function 'MVAU.__init__'
  - Line 61: function 'MVAU.get_nodeattr_types'
  - Line 134: function 'MVAU.execute_node'
  - Line 176: function 'MVAU.verify_node'
  - Line 231: function 'MVAU.infer_node_datatype'
  - Line 265: function 'MVAU.get_instream_width'
  - Line 298: function 'MVAU.get_outstream_width'
  - Line 303: function 'MVAU.get_folded_input_shape'
  - Line 329: function 'MVAU.get_folded_output_shape'
  - Line 337: function 'MVAU.get_normal_input_shape'
  - Line 349: function 'MVAU.get_normal_output_shape'
  - Line 375: function 'MVAU.uram_estimation'
  - Line 437: function 'MVAU.bram_efficiency_estimation'
  - Line 463: function 'MVAU.get_exp_cycles'
  - Line 788: function 'MVAU.generate_params'
  - Line 863: function 'MVAU.get_op_and_param_counts'
  - Line 887: function 'MVAU.get_verilog_top_module_intf_names'
  - Line 913: function 'MVAU.code_generation_ipi'
  - Line 1098: function 'MVAU.get_tree_model'
  - Line 1147: function 'MVAU.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/pool.py:
  - Line 233: function 'Pool.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/replicate_stream.py:
  - Line 1: module 'replicate_stream.py'
  - Line 27: class 'ReplicateStream'
  - Line 29: function 'ReplicateStream.__init__'
  - Line 40: function 'ReplicateStream.get_nodeattr_types'
  - Line 70: function 'ReplicateStream.num'
  - Line 75: function 'ReplicateStream.dtype'
  - Line 81: function 'ReplicateStream.num_elems'
  - Line 86: function 'ReplicateStream.pe'
  - Line 91: function 'ReplicateStream.num_inputs'
  - Line 97: function 'ReplicateStream.make_shape_compatible_op'
  - Line 113: function 'ReplicateStream.infer_node_datatype'
  - Line 132: function 'ReplicateStream._execute_node_python'
  - Line 143: function 'ReplicateStream._execute_node_cppsim'
  - Line 150: function 'ReplicateStream.execute_node'
  - Line 160: function 'ReplicateStream.verify_node'
  - Line 167: function 'ReplicateStream.get_input_datatype'
  - Line 172: function 'ReplicateStream.get_output_datatype'
  - Line 177: function 'ReplicateStream.get_normal_input_shape'
  - Line 183: function 'ReplicateStream.get_normal_output_shape'
  - Line 189: function 'ReplicateStream.get_folded_input_shape'
  - Line 196: function 'ReplicateStream.get_folded_output_shape'
  - Line 203: function 'ReplicateStream.get_instream_width'
  - Line 213: function 'ReplicateStream.get_outstream_width'
  - Line 224: function 'ReplicateStream.get_number_output_values'
  - Line 237: function 'ReplicateStream.get_exp_cycles'

📄 src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py:
  - Line 1: module 'streamingdatawidthconverter.py'
  - Line 44: function 'StreamingDataWidthConverter.get_nodeattr_types'
  - Line 68: function 'StreamingDataWidthConverter.get_normal_input_shape'
  - Line 72: function 'StreamingDataWidthConverter.get_normal_output_shape'
  - Line 76: function 'StreamingDataWidthConverter.get_iowidth_lcm'
  - Line 81: function 'StreamingDataWidthConverter.needs_lcm'
  - Line 88: function 'StreamingDataWidthConverter.check_divisible_iowidths'
  - Line 91: function 'StreamingDataWidthConverter.get_folded_input_shape'
  - Line 111: function 'StreamingDataWidthConverter.get_folded_output_shape'
  - Line 132: function 'StreamingDataWidthConverter.get_number_input_values'
  - Line 136: function 'StreamingDataWidthConverter.get_number_output_values'
  - Line 140: function 'StreamingDataWidthConverter.get_instream_width'
  - Line 144: function 'StreamingDataWidthConverter.get_outstream_width'
  - Line 148: function 'StreamingDataWidthConverter.infer_node_datatype'
  - Line 162: function 'StreamingDataWidthConverter.verify_node'
  - Line 179: function 'StreamingDataWidthConverter.execute_node'
  - Line 190: function 'StreamingDataWidthConverter.get_exp_cycles'
  - Line 222: function 'StreamingDataWidthConverter.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/thresholding.py:
  - Line 384: function 'Thresholding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/vectorvectoractivation.py:
  - Line 1067: function 'VVAU.get_tree_model'
  - Line 1122: function 'VVAU.derive_token_access_vectors'

📄 src/finn/transformation/fpgadataflow/derive_characteristic.py:
  - Line 1: module 'derive_characteristic.py'
  - Line 45: class 'JustInTimeSynthesize'
  - Line 46: function 'JustInTimeSynthesize.__init__'
  - Line 52: function 'JustInTimeSynthesize.apply'
  - Line 146: function 'DeriveTokenAccessVectors.__init__'
  - Line 166: function 'DeriveTokenAccessVectors.applyNodeLocal'
  - Line 196: function 'DeriveTokenAccessVectors.apply'
  - Line 214: function 'LocalStretchCharacteristicFunctions.__init__'
  - Line 219: function 'LocalStretchCharacteristicFunctions.applyNodeLocal'
  - Line 311: function 'get_top_producer_period'
  - Line 329: function 'get_top_consumer_period'
  - Line 395: function 'get_nodes_until_converging'
  - Line 406: function 'get_throughput'
  - Line 428: function 'get_parent_throughput'
  - Line 439: function 'get_parent'
  - Line 449: function 'get_consumer'
  - Line 455: function 'get_consumer_throughput'
  - Line 466: function 'get_true_period'
  - Line 473: function 'get_branch_nodes'
  - Line 481: function 'get_branch_volume'
  - Line 524: function 'calculate_peak_volume_delta'
  - Line 581: function 'compute_node_latency_init_periods'
  - Line 588: function 'max_dist'
  - Line 622: function 'get_full_branch_latency'
  - Line 629: function 'assign_extra_fifo_volume'
  - Line 738: function 'HandleBranches.__init__'
  - Line 743: function 'HandleBranches.apply'
  - Line 770: function 'ProducerDelayCharacteristicFunctions.__init__'
  - Line 775: function 'ProducerDelayCharacteristicFunctions.applyNodeLocal'
  - Line 845: function 'DelayCharacteristicFunctions.__init__'
  - Line 850: function 'DelayCharacteristicFunctions.applyNodeLocal'
  - Line 932: function 'inter_token_gaps'
  - Line 951: function 'remove_trailing_duplicates_keep_one'
  - Line 966: function 'remove_leading_duplicates_keep_one'
  - Line 989: function 'DeriveFIFOSizes.__init__'
  - Line 1017: function 'DeriveFIFOSizes.apply'

📄 src/finn/util/basic.py:
  - Line 410: function 'get_driver_shapes'
  - Line 502: function 'stretch'
  - Line 510: class 'Characteristic_Node'
  - Line 511: function 'Characteristic_Node.__init__'
  - Line 520: function 'Characteristic_Node.sum'
  - Line 581: function 'compress_numpy_to_string'
  - Line 597: function 'decompress_string_to_numpy'
  - Line 609: function 'compute_total_model_fifo_size'

Total missing docstrings: 327

@github-actions
Copy link
Copy Markdown

📋 Docstring Check Report

Checked files:

  • ci/collect.py
  • src/finn/analysis/fpgadataflow/dataflow_performance.py
  • src/finn/builder/build_dataflow_config.py
  • src/finn/builder/build_dataflow_steps.py
  • src/finn/custom_op/fpgadataflow/addstreams.py
  • src/finn/custom_op/fpgadataflow/attention.py
  • src/finn/custom_op/fpgadataflow/channelwise_op.py
  • src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py
  • src/finn/custom_op/fpgadataflow/duplicatestreams.py
  • src/finn/custom_op/fpgadataflow/elementwise_binary.py
  • src/finn/custom_op/fpgadataflow/fmpadding.py
  • src/finn/custom_op/fpgadataflow/hls/attention_hls.py
  • src/finn/custom_op/fpgadataflow/hls/replicate_stream_hls.py
  • src/finn/custom_op/fpgadataflow/hlsbackend.py
  • src/finn/custom_op/fpgadataflow/hwcustomop.py
  • src/finn/custom_op/fpgadataflow/labelselect.py
  • src/finn/custom_op/fpgadataflow/matrixvectoractivation.py
  • src/finn/custom_op/fpgadataflow/pool.py
  • src/finn/custom_op/fpgadataflow/replicate_stream.py
  • src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py
  • src/finn/custom_op/fpgadataflow/thresholding.py
  • src/finn/custom_op/fpgadataflow/vectorvectoractivation.py
  • src/finn/templates/python_driver/driver.py
  • src/finn/transformation/fpgadataflow/derive_characteristic.py
  • src/finn/transformation/fpgadataflow/make_zynq_proj.py
  • src/finn/util/basic.py
  • tests/fpgadataflow/test_convert_to_hw_pool_batch.py
  • tests/fpgadataflow/test_fifosizing.py
  • tests/fpgadataflow/test_fpgadataflow_attention.py
  • tests/fpgadataflow/test_fpgadataflow_channelwise_ops.py
  • tests/fpgadataflow/test_fpgadataflow_convinputgenerator.py
  • tests/fpgadataflow/test_fpgadataflow_downsampler.py
  • tests/fpgadataflow/test_fpgadataflow_dwc.py
  • tests/fpgadataflow/test_fpgadataflow_fmpadding.py
  • tests/fpgadataflow/test_fpgadataflow_labelselect.py
  • tests/fpgadataflow/test_fpgadataflow_mvau.py
  • tests/fpgadataflow/test_fpgadataflow_thresholding.py
  • tests/fpgadataflow/test_fpgadataflow_vvau.py
  • tests/testing_util/test.py

Docstring check failed!

Missing Docstrings Details:

  • ci/collect.py
  • src/finn/analysis/fpgadataflow/dataflow_performance.py
  • src/finn/builder/build_dataflow_config.py
  • src/finn/builder/build_dataflow_steps.py
  • src/finn/custom_op/fpgadataflow/addstreams.py
  • src/finn/custom_op/fpgadataflow/attention.py
  • src/finn/custom_op/fpgadataflow/channelwise_op.py
  • src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py
  • src/finn/custom_op/fpgadataflow/duplicatestreams.py
  • src/finn/custom_op/fpgadataflow/elementwise_binary.py
  • src/finn/custom_op/fpgadataflow/fmpadding.py
  • src/finn/custom_op/fpgadataflow/hls/attention_hls.py
  • src/finn/custom_op/fpgadataflow/hls/replicate_stream_hls.py
  • src/finn/custom_op/fpgadataflow/hlsbackend.py
  • src/finn/custom_op/fpgadataflow/hwcustomop.py
  • src/finn/custom_op/fpgadataflow/labelselect.py
  • src/finn/custom_op/fpgadataflow/matrixvectoractivation.py
  • src/finn/custom_op/fpgadataflow/pool.py
  • src/finn/custom_op/fpgadataflow/replicate_stream.py
  • src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py
  • src/finn/custom_op/fpgadataflow/thresholding.py
  • src/finn/custom_op/fpgadataflow/vectorvectoractivation.py
  • src/finn/templates/python_driver/driver.py
  • src/finn/transformation/fpgadataflow/derive_characteristic.py
  • src/finn/transformation/fpgadataflow/make_zynq_proj.py
  • src/finn/util/basic.py

📄 src/finn/analysis/fpgadataflow/dataflow_performance.py:

    • Line 1: module 'dataflow_performance.py'

📄 src/finn/custom_op/fpgadataflow/addstreams.py:

    • Line 1: module 'addstreams.py'
    • Line 41: function 'AddStreams.init'
    • Line 44: function 'AddStreams.get_nodeattr_types'
    • Line 62: function 'AddStreams.get_normal_input_shape'
    • Line 68: function 'AddStreams.get_folded_input_shape'
    • Line 76: function 'AddStreams.get_normal_output_shape'
    • Line 79: function 'AddStreams.get_folded_output_shape'
    • Line 82: function 'AddStreams.infer_node_datatype'
    • Line 137: function 'AddStreams.get_exp_cycles'
    • Line 141: function 'AddStreams.execute_node'
    • Line 153: function 'AddStreams.prepare_tree_model'
    • Line 161: function 'AddStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/attention.py:

    • Line 1: module 'attention.py'
    • Line 31: function 'softmax'
    • Line 49: class 'ScaledDotProductAttention'
    • Line 51: function 'ScaledDotProductAttention.init'
    • Line 56: function 'ScaledDotProductAttention.get_nodeattr_types'
    • Line 172: function 'ScaledDotProductAttention.shapes'
    • Line 180: function 'ScaledDotProductAttention.folds'
    • Line 188: function 'ScaledDotProductAttention.is_valid_folding'
    • Line 200: function 'ScaledDotProductAttention.iterations'
    • Line 207: function 'ScaledDotProductAttention.make_shape_compatible_op'
    • Line 226: function 'ScaledDotProductAttention.infer_node_datatype'
    • Line 287: function 'ScaledDotProductAttention._execute_node_python'
    • Line 299: function 'ScaledDotProductAttention.act_qk_matmul'
    • Line 316: function 'ScaledDotProductAttention.act_a_softmax'
    • Line 334: function 'ScaledDotProductAttention.act_av_matmul'
    • Line 410: function 'ScaledDotProductAttention._execute_node_cppsim'
    • Line 417: function 'ScaledDotProductAttention._execute_node_rtlsim'
    • Line 424: function 'ScaledDotProductAttention.execute_node'
    • Line 434: function 'ScaledDotProductAttention.verify_node'
    • Line 438: function 'ScaledDotProductAttention.get_input_datatype'
    • Line 477: function 'ScaledDotProductAttention.get_output_datatype'
    • Line 484: function 'ScaledDotProductAttention.get_normal_input_shape'
    • Line 533: function 'ScaledDotProductAttention.get_normal_output_shape'
    • Line 541: function 'ScaledDotProductAttention.get_normal_attention_shape'
    • Line 547: function 'ScaledDotProductAttention.get_folded_input_shape'
    • Line 579: function 'ScaledDotProductAttention.get_folded_output_shape'
    • Line 590: function 'ScaledDotProductAttention.get_folded_attention_shape'
    • Line 600: function 'ScaledDotProductAttention.get_instream_width'
    • Line 619: function 'ScaledDotProductAttention.get_outstream_width'
    • Line 629: function 'ScaledDotProductAttention.minimize_accumulator_width'
    • Line 716: function 'ScaledDotProductAttention.get_number_input_values'
    • Line 723: function 'ScaledDotProductAttention.get_number_output_values'
    • Line 733: function 'ScaledDotProductAttention.get_input_name_by_name'
    • Line 772: function 'ScaledDotProductAttention.get_exp_cycles'

📄 src/finn/custom_op/fpgadataflow/channelwise_op.py:

    • Line 1: module 'channelwise_op.py'
    • Line 80: function 'ChannelwiseOp.init'
    • Line 83: function 'ChannelwiseOp.get_nodeattr_types'
    • Line 112: function 'ChannelwiseOp.infer_node_datatype'
    • Line 162: function 'ChannelwiseOp.get_instream_width'
    • Line 172: function 'ChannelwiseOp.get_outstream_width'
    • Line 176: function 'ChannelwiseOp.get_folded_input_shape'
    • Line 189: function 'ChannelwiseOp.get_folded_output_shape'
    • Line 193: function 'ChannelwiseOp.get_normal_input_shape'
    • Line 206: function 'ChannelwiseOp.get_normal_output_shape'
    • Line 210: function 'ChannelwiseOp.get_exp_cycles'
    • Line 214: function 'ChannelwiseOp.execute_node'
    • Line 245: function 'ChannelwiseOp.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py:

    • Line 1: module 'convolutioninputgenerator.py'
    • Line 50: function 'ConvolutionInputGenerator.init'
    • Line 53: function 'ConvolutionInputGenerator.get_nodeattr_types'
    • Line 88: function 'ConvolutionInputGenerator.get_normal_input_shape'
    • Line 94: function 'ConvolutionInputGenerator.get_folded_input_shape'
    • Line 103: function 'ConvolutionInputGenerator.get_normal_output_shape'
    • Line 115: function 'ConvolutionInputGenerator.get_folded_output_shape'
    • Line 134: function 'ConvolutionInputGenerator.infer_node_datatype'
    • Line 179: function 'ConvolutionInputGenerator.get_outstream_width'
    • Line 188: function 'ConvolutionInputGenerator.get_1d_conv_attrs_normalized'
    • Line 214: function 'ConvolutionInputGenerator.get_exp_cycles'
    • Line 217: function 'ConvolutionInputGenerator.bram_estimation'
    • Line 220: function 'ConvolutionInputGenerator.lut_estimation'
    • Line 223: function 'ConvolutionInputGenerator.uram_estimation'
    • Line 226: function 'ConvolutionInputGenerator.execute_node'
    • Line 265: function 'ConvolutionInputGenerator.get_tree_model_uniform_distribution_based'
    • Line 266: function 'ConvolutionInputGenerator.distribute_outputs_uniform'
    • Line 563: function 'ConvolutionInputGenerator.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/duplicatestreams.py:

    • Line 1: module 'duplicatestreams.py'
    • Line 40: function 'DuplicateStreams.init'
    • Line 43: function 'DuplicateStreams.get_nodeattr_types'
    • Line 60: function 'DuplicateStreams.get_num_output_streams'
    • Line 63: function 'DuplicateStreams.get_normal_input_shape'
    • Line 69: function 'DuplicateStreams.get_folded_input_shape'
    • Line 78: function 'DuplicateStreams.get_normal_output_shape'
    • Line 83: function 'DuplicateStreams.get_folded_output_shape'
    • Line 88: function 'DuplicateStreams.make_shape_compatible_op'
    • Line 93: function 'DuplicateStreams.infer_node_datatype'
    • Line 130: function 'DuplicateStreams.get_number_output_values'
    • Line 136: function 'DuplicateStreams.get_exp_cycles'
    • Line 140: function 'DuplicateStreams.execute_node'
    • Line 152: function 'DuplicateStreams.get_tree_model'
    • Line 162: function 'DuplicateStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/elementwise_binary.py:

    • Line 1: module 'elementwise_binary.py'
    • Line 44: class 'ElementwiseBinaryOperation'
    • Line 51: function 'ElementwiseBinaryOperation.npy_op'
    • Line 56: function 'ElementwiseBinaryOperation.cpp_op'
    • Line 61: function 'ElementwiseBinaryOperation.rtl_op'
    • Line 65: function 'ElementwiseBinaryOperation.init'
    • Line 70: function 'ElementwiseBinaryOperation.get_nodeattr_types'
    • Line 119: function 'ElementwiseBinaryOperation.lhs_dtype'
    • Line 125: function 'ElementwiseBinaryOperation.rhs_dtype'
    • Line 131: function 'ElementwiseBinaryOperation.out_dtype'
    • Line 137: function 'ElementwiseBinaryOperation.lhs_shape'
    • Line 142: function 'ElementwiseBinaryOperation.rhs_shape'
    • Line 147: function 'ElementwiseBinaryOperation.out_shape'
    • Line 152: function 'ElementwiseBinaryOperation.lhs_style'
    • Line 157: function 'ElementwiseBinaryOperation.rhs_style'
    • Line 162: function 'ElementwiseBinaryOperation.pe'
    • Line 167: function 'ElementwiseBinaryOperation.broadcast_last_axis'
    • Line 173: function 'ElementwiseBinaryOperation.make_shape_compatible_op'
    • Line 193: function 'ElementwiseBinaryOperation.infer_node_datatype'
    • Line 215: function 'ElementwiseBinaryOperation.execute_node'
    • Line 240: function 'ElementwiseBinaryOperation.get_input_datatype'
    • Line 245: function 'ElementwiseBinaryOperation.get_output_datatype'
    • Line 250: function 'ElementwiseBinaryOperation.get_normal_input_shape'
    • Line 255: function 'ElementwiseBinaryOperation.get_normal_output_shape'
    • Line 260: function 'ElementwiseBinaryOperation.get_folded_input_shape'
    • Line 274: function 'ElementwiseBinaryOperation.get_folded_output_shape'
    • Line 288: function 'ElementwiseBinaryOperation.get_instream_width'
    • Line 310: function 'ElementwiseBinaryOperation.get_outstream_width'
    • Line 321: function 'ElementwiseBinaryOperation.minimize_accumulator_width'
    • Line 344: function 'ElementwiseBinaryOperation._derive_out_dtype'
    • Line 353: function 'ElementwiseBinaryOperation.minimize_weight_bit_width'
    • Line 437: function 'ElementwiseBinaryOperation.get_exp_cycles'
    • Line 445: class 'ElementwiseAdd'
    • Line 451: function 'ElementwiseAdd._derive_out_dtype'
    • Line 485: class 'ElementwiseSub'
    • Line 491: function 'ElementwiseSub._derive_out_dtype'
    • Line 521: class 'ElementwiseMul'
    • Line 527: function 'ElementwiseMul._derive_out_dtype'
    • Line 542: class 'ElementwiseDiv'
    • Line 549: function 'ElementwiseDiv._derive_out_dtype'
    • Line 568: class 'ElementwiseAnd'
    • Line 574: function 'ElementwiseAnd._derive_out_dtype'
    • Line 582: class 'ElementwiseOr'
    • Line 588: function 'ElementwiseOr._derive_out_dtype'
    • Line 596: class 'ElementwiseXor'
    • Line 602: function 'ElementwiseXor._derive_out_dtype'
    • Line 610: class 'ElementwiseEqual'
    • Line 616: function 'ElementwiseEqual._derive_out_dtype'
    • Line 624: class 'ElementwiseLess'
    • Line 630: function 'ElementwiseLess._derive_out_dtype'
    • Line 638: class 'ElementwiseLessOrEqual'
    • Line 644: function 'ElementwiseLessOrEqual._derive_out_dtype'
    • Line 652: class 'ElementwiseGreater'
    • Line 658: function 'ElementwiseGreater._derive_out_dtype'
    • Line 667: class 'ElementwiseGreaterOrEqual'
    • Line 673: function 'ElementwiseGreaterOrEqual._derive_out_dtype'
    • Line 681: class 'ElementwiseBitwiseAnd'
    • Line 687: function 'ElementwiseBitwiseAnd._derive_out_dtype'
    • Line 703: class 'ElementwiseBitwiseOr'
    • Line 709: function 'ElementwiseBitwiseOr._derive_out_dtype'
    • Line 725: class 'ElementwiseBitwiseXor'
    • Line 731: function 'ElementwiseBitwiseXor._derive_out_dtype'
    • Line 747: class 'ElementwiseBitShift'
    • Line 749: function 'ElementwiseBitShift.get_nodeattr_types'
    • Line 763: function 'ElementwiseBitShift.npy_op'
    • Line 768: function 'ElementwiseBitShift.cpp_op'
    • Line 773: function 'ElementwiseBitShift.rtl_op'
    • Line 777: function 'ElementwiseBitShift._derive_out_dtype'
    • Line 794: class 'ElementwiseMax'
    • Line 796: function 'ElementwiseMax.npy_op'
    • Line 801: function 'ElementwiseMax.cpp_op'
    • Line 807: function 'ElementwiseMax.rtl_op'
    • Line 810: function 'ElementwiseMax._derive_out_dtype'

📄 src/finn/custom_op/fpgadataflow/fmpadding.py:

    • Line 1: module 'fmpadding.py'
    • Line 41: function 'FMPadding.init'
    • Line 44: function 'FMPadding.get_nodeattr_types'
    • Line 76: function 'FMPadding.get_exp_cycles'
    • Line 84: function 'FMPadding.get_normal_input_shape'
    • Line 90: function 'FMPadding.get_normal_output_shape'
    • Line 97: function 'FMPadding.get_folded_input_shape'
    • Line 106: function 'FMPadding.get_folded_output_shape'
    • Line 115: function 'FMPadding.make_shape_compatible_op'
    • Line 122: function 'FMPadding.infer_node_datatype'
    • Line 135: function 'FMPadding.verify_node'
    • Line 150: function 'FMPadding.get_instream_width'
    • Line 155: function 'FMPadding.get_outstream_width'
    • Line 160: function 'FMPadding.get_number_output_values'
    • Line 164: function 'FMPadding.execute_node'
    • Line 175: function 'FMPadding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/hls/replicate_stream_hls.py:

    • Line 1: module 'replicate_stream_hls.py'
    • Line 15: class 'ReplicateStream_hls'
    • Line 20: function 'ReplicateStream_hls.get_nodeattr_types'
    • Line 30: function 'ReplicateStream_hls.get_ap_int_max_w'
    • Line 46: function 'ReplicateStream_hls.global_includes'
    • Line 51: function 'ReplicateStream_hls.defines'
    • Line 74: function 'ReplicateStream_hls.docompute'
    • Line 76: function 'ReplicateStream_hls.out'
    • Line 100: function 'ReplicateStream_hls.blackboxfunction'
    • Line 119: function 'ReplicateStream_hls.pragmas'
    • Line 138: function 'ReplicateStream_hls.get_verilog_top_module_intf_names'

📄 src/finn/custom_op/fpgadataflow/hwcustomop.py:

    • Line 1: module 'hwcustomop.py'
    • Line 47: function 'HWCustomOp.init'
    • Line 51: function 'HWCustomOp.get_nodeattr_types'
    • Line 102: function 'HWCustomOp.make_shape_compatible_op'
    • Line 313: function 'HWCustomOp.derive_token_access_vectors'
    • Line 343: function 'HWCustomOp.derive_token_access_vectors_using_tree_model'
    • Line 510: function 'HWCustomOp.generate_hdl_dynload'
    • Line 619: function 'HWCustomOp.accumulate_char_fxn'

📄 src/finn/custom_op/fpgadataflow/labelselect.py:

    • Line 1: module 'labelselect.py'
    • Line 41: function 'LabelSelect.init'
    • Line 55: function 'LabelSelect.get_nodeattr_types'
    • Line 72: function 'LabelSelect.get_normal_input_shape'
    • Line 78: function 'LabelSelect.get_folded_input_shape'
    • Line 87: function 'LabelSelect.get_normal_output_shape'
    • Line 93: function 'LabelSelect.get_folded_output_shape'
    • Line 99: function 'LabelSelect.make_shape_compatible_op'
    • Line 114: function 'LabelSelect.infer_node_datatype'
    • Line 123: function 'LabelSelect.verify_node'
    • Line 147: function 'LabelSelect.get_number_output_values'
    • Line 150: function 'LabelSelect.execute_node'
    • Line 180: function 'LabelSelect.get_exp_cycles'
    • Line 187: function 'LabelSelect.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/matrixvectoractivation.py:

    • Line 1: module 'matrixvectoractivation.py'
    • Line 58: function 'MVAU.init'
    • Line 61: function 'MVAU.get_nodeattr_types'
    • Line 134: function 'MVAU.execute_node'
    • Line 176: function 'MVAU.verify_node'
    • Line 231: function 'MVAU.infer_node_datatype'
    • Line 265: function 'MVAU.get_instream_width'
    • Line 298: function 'MVAU.get_outstream_width'
    • Line 303: function 'MVAU.get_folded_input_shape'
    • Line 329: function 'MVAU.get_folded_output_shape'
    • Line 337: function 'MVAU.get_normal_input_shape'
    • Line 349: function 'MVAU.get_normal_output_shape'
    • Line 375: function 'MVAU.uram_estimation'
    • Line 437: function 'MVAU.bram_efficiency_estimation'
    • Line 463: function 'MVAU.get_exp_cycles'
    • Line 788: function 'MVAU.generate_params'
    • Line 863: function 'MVAU.get_op_and_param_counts'
    • Line 887: function 'MVAU.get_verilog_top_module_intf_names'
    • Line 913: function 'MVAU.code_generation_ipi'
    • Line 1098: function 'MVAU.get_tree_model'
    • Line 1147: function 'MVAU.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/pool.py:

    • Line 233: function 'Pool.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/replicate_stream.py:

    • Line 1: module 'replicate_stream.py'
    • Line 27: class 'ReplicateStream'
    • Line 29: function 'ReplicateStream.init'
    • Line 40: function 'ReplicateStream.get_nodeattr_types'
    • Line 70: function 'ReplicateStream.num'
    • Line 75: function 'ReplicateStream.dtype'
    • Line 81: function 'ReplicateStream.num_elems'
    • Line 86: function 'ReplicateStream.pe'
    • Line 91: function 'ReplicateStream.num_inputs'
    • Line 97: function 'ReplicateStream.make_shape_compatible_op'
    • Line 113: function 'ReplicateStream.infer_node_datatype'
    • Line 132: function 'ReplicateStream._execute_node_python'
    • Line 143: function 'ReplicateStream._execute_node_cppsim'
    • Line 150: function 'ReplicateStream.execute_node'
    • Line 160: function 'ReplicateStream.verify_node'
    • Line 167: function 'ReplicateStream.get_input_datatype'
    • Line 172: function 'ReplicateStream.get_output_datatype'
    • Line 177: function 'ReplicateStream.get_normal_input_shape'
    • Line 183: function 'ReplicateStream.get_normal_output_shape'
    • Line 189: function 'ReplicateStream.get_folded_input_shape'
    • Line 196: function 'ReplicateStream.get_folded_output_shape'
    • Line 203: function 'ReplicateStream.get_instream_width'
    • Line 213: function 'ReplicateStream.get_outstream_width'
    • Line 224: function 'ReplicateStream.get_number_output_values'
    • Line 237: function 'ReplicateStream.get_exp_cycles'

📄 src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py:

    • Line 1: module 'streamingdatawidthconverter.py'
    • Line 44: function 'StreamingDataWidthConverter.get_nodeattr_types'
    • Line 68: function 'StreamingDataWidthConverter.get_normal_input_shape'
    • Line 72: function 'StreamingDataWidthConverter.get_normal_output_shape'
    • Line 76: function 'StreamingDataWidthConverter.get_iowidth_lcm'
    • Line 81: function 'StreamingDataWidthConverter.needs_lcm'
    • Line 88: function 'StreamingDataWidthConverter.check_divisible_iowidths'
    • Line 91: function 'StreamingDataWidthConverter.get_folded_input_shape'
    • Line 111: function 'StreamingDataWidthConverter.get_folded_output_shape'
    • Line 132: function 'StreamingDataWidthConverter.get_number_input_values'
    • Line 136: function 'StreamingDataWidthConverter.get_number_output_values'
    • Line 140: function 'StreamingDataWidthConverter.get_instream_width'
    • Line 144: function 'StreamingDataWidthConverter.get_outstream_width'
    • Line 148: function 'StreamingDataWidthConverter.infer_node_datatype'
    • Line 162: function 'StreamingDataWidthConverter.verify_node'
    • Line 179: function 'StreamingDataWidthConverter.execute_node'
    • Line 190: function 'StreamingDataWidthConverter.get_exp_cycles'
    • Line 222: function 'StreamingDataWidthConverter.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/thresholding.py:

    • Line 384: function 'Thresholding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/vectorvectoractivation.py:

    • Line 1067: function 'VVAU.get_tree_model'
    • Line 1122: function 'VVAU.derive_token_access_vectors'

📄 src/finn/templates/python_driver/driver.py:

    • Line 881: function 'FINNLiveFIFOOverlay.ctrl_read'
    • Line 893: function 'FINNLiveFIFOOverlay.ctrl_write'

📄 src/finn/transformation/fpgadataflow/derive_characteristic.py:

    • Line 1: module 'derive_characteristic.py'
    • Line 45: class 'JustInTimeSynthesizeParallel'
    • Line 46: function 'JustInTimeSynthesizeParallel.init'
    • Line 52: function 'JustInTimeSynthesizeParallel.applyNodeLocal'
    • Line 95: class 'JustInTimeSynthesize'
    • Line 96: function 'JustInTimeSynthesize.init'
    • Line 102: function 'JustInTimeSynthesize.apply'
    • Line 159: function 'DeriveTokenAccessVectors.init'
    • Line 179: function 'DeriveTokenAccessVectors.applyNodeLocal'
    • Line 209: function 'DeriveTokenAccessVectors.apply'
    • Line 227: function 'LocalStretchCharacteristicFunctions.init'
    • Line 232: function 'LocalStretchCharacteristicFunctions.applyNodeLocal'
    • Line 324: function 'get_top_producer_period'
    • Line 342: function 'get_top_consumer_period'
    • Line 408: function 'get_nodes_until_converging'
    • Line 419: function 'get_throughput'
    • Line 441: function 'get_parent_throughput'
    • Line 452: function 'get_parent'
    • Line 462: function 'get_consumer'
    • Line 468: function 'get_consumer_throughput'
    • Line 479: function 'get_true_period'
    • Line 486: function 'get_branch_nodes'
    • Line 494: function 'get_branch_volume'
    • Line 537: function 'calculate_peak_volume_delta'
    • Line 594: function 'compute_node_latency_init_periods'
    • Line 601: function 'max_dist'
    • Line 635: function 'get_full_branch_latency'
    • Line 642: function 'assign_extra_fifo_volume'
    • Line 751: function 'HandleBranches.init'
    • Line 756: function 'HandleBranches.apply'
    • Line 783: function 'ProducerDelayCharacteristicFunctions.init'
    • Line 788: function 'ProducerDelayCharacteristicFunctions.applyNodeLocal'
    • Line 858: function 'DelayCharacteristicFunctions.init'
    • Line 863: function 'DelayCharacteristicFunctions.applyNodeLocal'
    • Line 945: function 'inter_token_gaps'
    • Line 964: function 'remove_trailing_duplicates_keep_one'
    • Line 979: function 'remove_leading_duplicates_keep_one'
    • Line 1001: function 'DeriveFIFOSizes.init'
    • Line 1029: function 'DeriveFIFOSizes.apply'

📄 src/finn/util/basic.py:

    • Line 410: function 'get_driver_shapes'
    • Line 502: function 'stretch'
    • Line 510: class 'Characteristic_Node'
    • Line 511: function 'Characteristic_Node.init'
    • Line 520: function 'Characteristic_Node.sum'
    • Line 581: function 'compress_numpy_to_string'
    • Line 597: function 'decompress_string_to_numpy'
    • Line 609: function 'compute_total_model_fifo_size'

Total missing docstrings: 332

How to Fix:

Please add docstrings to the missing functions, classes, and modules listed above.

Docstring Guidelines:

  • All modules should have a module-level docstring
  • All public functions and methods should have docstrings
  • All private functions should have docstrings
  • All classes should have docstrings
  • Use triple quotes (""") for docstrings
  • Follow PEP 257 conventions
Raw output from docstring checker
Checking 26 specified Python file(s) (excluding tests folder):
  - ci/collect.py
  - src/finn/analysis/fpgadataflow/dataflow_performance.py
  - src/finn/builder/build_dataflow_config.py
  - src/finn/builder/build_dataflow_steps.py
  - src/finn/custom_op/fpgadataflow/addstreams.py
  - src/finn/custom_op/fpgadataflow/attention.py
  - src/finn/custom_op/fpgadataflow/channelwise_op.py
  - src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py
  - src/finn/custom_op/fpgadataflow/duplicatestreams.py
  - src/finn/custom_op/fpgadataflow/elementwise_binary.py
  - src/finn/custom_op/fpgadataflow/fmpadding.py
  - src/finn/custom_op/fpgadataflow/hls/attention_hls.py
  - src/finn/custom_op/fpgadataflow/hls/replicate_stream_hls.py
  - src/finn/custom_op/fpgadataflow/hlsbackend.py
  - src/finn/custom_op/fpgadataflow/hwcustomop.py
  - src/finn/custom_op/fpgadataflow/labelselect.py
  - src/finn/custom_op/fpgadataflow/matrixvectoractivation.py
  - src/finn/custom_op/fpgadataflow/pool.py
  - src/finn/custom_op/fpgadataflow/replicate_stream.py
  - src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py
  - src/finn/custom_op/fpgadataflow/thresholding.py
  - src/finn/custom_op/fpgadataflow/vectorvectoractivation.py
  - src/finn/templates/python_driver/driver.py
  - src/finn/transformation/fpgadataflow/derive_characteristic.py
  - src/finn/transformation/fpgadataflow/make_zynq_proj.py
  - src/finn/util/basic.py

❌ Missing docstrings found:

📄 src/finn/analysis/fpgadataflow/dataflow_performance.py:
  - Line 1: module 'dataflow_performance.py'

📄 src/finn/custom_op/fpgadataflow/addstreams.py:
  - Line 1: module 'addstreams.py'
  - Line 41: function 'AddStreams.__init__'
  - Line 44: function 'AddStreams.get_nodeattr_types'
  - Line 62: function 'AddStreams.get_normal_input_shape'
  - Line 68: function 'AddStreams.get_folded_input_shape'
  - Line 76: function 'AddStreams.get_normal_output_shape'
  - Line 79: function 'AddStreams.get_folded_output_shape'
  - Line 82: function 'AddStreams.infer_node_datatype'
  - Line 137: function 'AddStreams.get_exp_cycles'
  - Line 141: function 'AddStreams.execute_node'
  - Line 153: function 'AddStreams.prepare_tree_model'
  - Line 161: function 'AddStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/attention.py:
  - Line 1: module 'attention.py'
  - Line 31: function 'softmax'
  - Line 49: class 'ScaledDotProductAttention'
  - Line 51: function 'ScaledDotProductAttention.__init__'
  - Line 56: function 'ScaledDotProductAttention.get_nodeattr_types'
  - Line 172: function 'ScaledDotProductAttention.shapes'
  - Line 180: function 'ScaledDotProductAttention.folds'
  - Line 188: function 'ScaledDotProductAttention.is_valid_folding'
  - Line 200: function 'ScaledDotProductAttention.iterations'
  - Line 207: function 'ScaledDotProductAttention.make_shape_compatible_op'
  - Line 226: function 'ScaledDotProductAttention.infer_node_datatype'
  - Line 287: function 'ScaledDotProductAttention._execute_node_python'
  - Line 299: function 'ScaledDotProductAttention.act_qk_matmul'
  - Line 316: function 'ScaledDotProductAttention.act_a_softmax'
  - Line 334: function 'ScaledDotProductAttention.act_av_matmul'
  - Line 410: function 'ScaledDotProductAttention._execute_node_cppsim'
  - Line 417: function 'ScaledDotProductAttention._execute_node_rtlsim'
  - Line 424: function 'ScaledDotProductAttention.execute_node'
  - Line 434: function 'ScaledDotProductAttention.verify_node'
  - Line 438: function 'ScaledDotProductAttention.get_input_datatype'
  - Line 477: function 'ScaledDotProductAttention.get_output_datatype'
  - Line 484: function 'ScaledDotProductAttention.get_normal_input_shape'
  - Line 533: function 'ScaledDotProductAttention.get_normal_output_shape'
  - Line 541: function 'ScaledDotProductAttention.get_normal_attention_shape'
  - Line 547: function 'ScaledDotProductAttention.get_folded_input_shape'
  - Line 579: function 'ScaledDotProductAttention.get_folded_output_shape'
  - Line 590: function 'ScaledDotProductAttention.get_folded_attention_shape'
  - Line 600: function 'ScaledDotProductAttention.get_instream_width'
  - Line 619: function 'ScaledDotProductAttention.get_outstream_width'
  - Line 629: function 'ScaledDotProductAttention.minimize_accumulator_width'
  - Line 716: function 'ScaledDotProductAttention.get_number_input_values'
  - Line 723: function 'ScaledDotProductAttention.get_number_output_values'
  - Line 733: function 'ScaledDotProductAttention.get_input_name_by_name'
  - Line 772: function 'ScaledDotProductAttention.get_exp_cycles'

📄 src/finn/custom_op/fpgadataflow/channelwise_op.py:
  - Line 1: module 'channelwise_op.py'
  - Line 80: function 'ChannelwiseOp.__init__'
  - Line 83: function 'ChannelwiseOp.get_nodeattr_types'
  - Line 112: function 'ChannelwiseOp.infer_node_datatype'
  - Line 162: function 'ChannelwiseOp.get_instream_width'
  - Line 172: function 'ChannelwiseOp.get_outstream_width'
  - Line 176: function 'ChannelwiseOp.get_folded_input_shape'
  - Line 189: function 'ChannelwiseOp.get_folded_output_shape'
  - Line 193: function 'ChannelwiseOp.get_normal_input_shape'
  - Line 206: function 'ChannelwiseOp.get_normal_output_shape'
  - Line 210: function 'ChannelwiseOp.get_exp_cycles'
  - Line 214: function 'ChannelwiseOp.execute_node'
  - Line 245: function 'ChannelwiseOp.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py:
  - Line 1: module 'convolutioninputgenerator.py'
  - Line 50: function 'ConvolutionInputGenerator.__init__'
  - Line 53: function 'ConvolutionInputGenerator.get_nodeattr_types'
  - Line 88: function 'ConvolutionInputGenerator.get_normal_input_shape'
  - Line 94: function 'ConvolutionInputGenerator.get_folded_input_shape'
  - Line 103: function 'ConvolutionInputGenerator.get_normal_output_shape'
  - Line 115: function 'ConvolutionInputGenerator.get_folded_output_shape'
  - Line 134: function 'ConvolutionInputGenerator.infer_node_datatype'
  - Line 179: function 'ConvolutionInputGenerator.get_outstream_width'
  - Line 188: function 'ConvolutionInputGenerator.get_1d_conv_attrs_normalized'
  - Line 214: function 'ConvolutionInputGenerator.get_exp_cycles'
  - Line 217: function 'ConvolutionInputGenerator.bram_estimation'
  - Line 220: function 'ConvolutionInputGenerator.lut_estimation'
  - Line 223: function 'ConvolutionInputGenerator.uram_estimation'
  - Line 226: function 'ConvolutionInputGenerator.execute_node'
  - Line 265: function 'ConvolutionInputGenerator.get_tree_model_uniform_distribution_based'
  - Line 266: function 'ConvolutionInputGenerator.distribute_outputs_uniform'
  - Line 563: function 'ConvolutionInputGenerator.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/duplicatestreams.py:
  - Line 1: module 'duplicatestreams.py'
  - Line 40: function 'DuplicateStreams.__init__'
  - Line 43: function 'DuplicateStreams.get_nodeattr_types'
  - Line 60: function 'DuplicateStreams.get_num_output_streams'
  - Line 63: function 'DuplicateStreams.get_normal_input_shape'
  - Line 69: function 'DuplicateStreams.get_folded_input_shape'
  - Line 78: function 'DuplicateStreams.get_normal_output_shape'
  - Line 83: function 'DuplicateStreams.get_folded_output_shape'
  - Line 88: function 'DuplicateStreams.make_shape_compatible_op'
  - Line 93: function 'DuplicateStreams.infer_node_datatype'
  - Line 130: function 'DuplicateStreams.get_number_output_values'
  - Line 136: function 'DuplicateStreams.get_exp_cycles'
  - Line 140: function 'DuplicateStreams.execute_node'
  - Line 152: function 'DuplicateStreams.get_tree_model'
  - Line 162: function 'DuplicateStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/elementwise_binary.py:
  - Line 1: module 'elementwise_binary.py'
  - Line 44: class 'ElementwiseBinaryOperation'
  - Line 51: function 'ElementwiseBinaryOperation.npy_op'
  - Line 56: function 'ElementwiseBinaryOperation.cpp_op'
  - Line 61: function 'ElementwiseBinaryOperation.rtl_op'
  - Line 65: function 'ElementwiseBinaryOperation.__init__'
  - Line 70: function 'ElementwiseBinaryOperation.get_nodeattr_types'
  - Line 119: function 'ElementwiseBinaryOperation.lhs_dtype'
  - Line 125: function 'ElementwiseBinaryOperation.rhs_dtype'
  - Line 131: function 'ElementwiseBinaryOperation.out_dtype'
  - Line 137: function 'ElementwiseBinaryOperation.lhs_shape'
  - Line 142: function 'ElementwiseBinaryOperation.rhs_shape'
  - Line 147: function 'ElementwiseBinaryOperation.out_shape'
  - Line 152: function 'ElementwiseBinaryOperation.lhs_style'
  - Line 157: function 'ElementwiseBinaryOperation.rhs_style'
  - Line 162: function 'ElementwiseBinaryOperation.pe'
  - Line 167: function 'ElementwiseBinaryOperation.broadcast_last_axis'
  - Line 173: function 'ElementwiseBinaryOperation.make_shape_compatible_op'
  - Line 193: function 'ElementwiseBinaryOperation.infer_node_datatype'
  - Line 215: function 'ElementwiseBinaryOperation.execute_node'
  - Line 240: function 'ElementwiseBinaryOperation.get_input_datatype'
  - Line 245: function 'ElementwiseBinaryOperation.get_output_datatype'
  - Line 250: function 'ElementwiseBinaryOperation.get_normal_input_shape'
  - Line 255: function 'ElementwiseBinaryOperation.get_normal_output_shape'
  - Line 260: function 'ElementwiseBinaryOperation.get_folded_input_shape'
  - Line 274: function 'ElementwiseBinaryOperation.get_folded_output_shape'
  - Line 288: function 'ElementwiseBinaryOperation.get_instream_width'
  - Line 310: function 'ElementwiseBinaryOperation.get_outstream_width'
  - Line 321: function 'ElementwiseBinaryOperation.minimize_accumulator_width'
  - Line 344: function 'ElementwiseBinaryOperation._derive_out_dtype'
  - Line 353: function 'ElementwiseBinaryOperation.minimize_weight_bit_width'
  - Line 437: function 'ElementwiseBinaryOperation.get_exp_cycles'
  - Line 445: class 'ElementwiseAdd'
  - Line 451: function 'ElementwiseAdd._derive_out_dtype'
  - Line 485: class 'ElementwiseSub'
  - Line 491: function 'ElementwiseSub._derive_out_dtype'
  - Line 521: class 'ElementwiseMul'
  - Line 527: function 'ElementwiseMul._derive_out_dtype'
  - Line 542: class 'ElementwiseDiv'
  - Line 549: function 'ElementwiseDiv._derive_out_dtype'
  - Line 568: class 'ElementwiseAnd'
  - Line 574: function 'ElementwiseAnd._derive_out_dtype'
  - Line 582: class 'ElementwiseOr'
  - Line 588: function 'ElementwiseOr._derive_out_dtype'
  - Line 596: class 'ElementwiseXor'
  - Line 602: function 'ElementwiseXor._derive_out_dtype'
  - Line 610: class 'ElementwiseEqual'
  - Line 616: function 'ElementwiseEqual._derive_out_dtype'
  - Line 624: class 'ElementwiseLess'
  - Line 630: function 'ElementwiseLess._derive_out_dtype'
  - Line 638: class 'ElementwiseLessOrEqual'
  - Line 644: function 'ElementwiseLessOrEqual._derive_out_dtype'
  - Line 652: class 'ElementwiseGreater'
  - Line 658: function 'ElementwiseGreater._derive_out_dtype'
  - Line 667: class 'ElementwiseGreaterOrEqual'
  - Line 673: function 'ElementwiseGreaterOrEqual._derive_out_dtype'
  - Line 681: class 'ElementwiseBitwiseAnd'
  - Line 687: function 'ElementwiseBitwiseAnd._derive_out_dtype'
  - Line 703: class 'ElementwiseBitwiseOr'
  - Line 709: function 'ElementwiseBitwiseOr._derive_out_dtype'
  - Line 725: class 'ElementwiseBitwiseXor'
  - Line 731: function 'ElementwiseBitwiseXor._derive_out_dtype'
  - Line 747: class 'ElementwiseBitShift'
  - Line 749: function 'ElementwiseBitShift.get_nodeattr_types'
  - Line 763: function 'ElementwiseBitShift.npy_op'
  - Line 768: function 'ElementwiseBitShift.cpp_op'
  - Line 773: function 'ElementwiseBitShift.rtl_op'
  - Line 777: function 'ElementwiseBitShift._derive_out_dtype'
  - Line 794: class 'ElementwiseMax'
  - Line 796: function 'ElementwiseMax.npy_op'
  - Line 801: function 'ElementwiseMax.cpp_op'
  - Line 807: function 'ElementwiseMax.rtl_op'
  - Line 810: function 'ElementwiseMax._derive_out_dtype'

📄 src/finn/custom_op/fpgadataflow/fmpadding.py:
  - Line 1: module 'fmpadding.py'
  - Line 41: function 'FMPadding.__init__'
  - Line 44: function 'FMPadding.get_nodeattr_types'
  - Line 76: function 'FMPadding.get_exp_cycles'
  - Line 84: function 'FMPadding.get_normal_input_shape'
  - Line 90: function 'FMPadding.get_normal_output_shape'
  - Line 97: function 'FMPadding.get_folded_input_shape'
  - Line 106: function 'FMPadding.get_folded_output_shape'
  - Line 115: function 'FMPadding.make_shape_compatible_op'
  - Line 122: function 'FMPadding.infer_node_datatype'
  - Line 135: function 'FMPadding.verify_node'
  - Line 150: function 'FMPadding.get_instream_width'
  - Line 155: function 'FMPadding.get_outstream_width'
  - Line 160: function 'FMPadding.get_number_output_values'
  - Line 164: function 'FMPadding.execute_node'
  - Line 175: function 'FMPadding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/hls/replicate_stream_hls.py:
  - Line 1: module 'replicate_stream_hls.py'
  - Line 15: class 'ReplicateStream_hls'
  - Line 20: function 'ReplicateStream_hls.get_nodeattr_types'
  - Line 30: function 'ReplicateStream_hls.get_ap_int_max_w'
  - Line 46: function 'ReplicateStream_hls.global_includes'
  - Line 51: function 'ReplicateStream_hls.defines'
  - Line 74: function 'ReplicateStream_hls.docompute'
  - Line 76: function 'ReplicateStream_hls.out'
  - Line 100: function 'ReplicateStream_hls.blackboxfunction'
  - Line 119: function 'ReplicateStream_hls.pragmas'
  - Line 138: function 'ReplicateStream_hls.get_verilog_top_module_intf_names'

📄 src/finn/custom_op/fpgadataflow/hwcustomop.py:
  - Line 1: module 'hwcustomop.py'
  - Line 47: function 'HWCustomOp.__init__'
  - Line 51: function 'HWCustomOp.get_nodeattr_types'
  - Line 102: function 'HWCustomOp.make_shape_compatible_op'
  - Line 313: function 'HWCustomOp.derive_token_access_vectors'
  - Line 343: function 'HWCustomOp.derive_token_access_vectors_using_tree_model'
  - Line 510: function 'HWCustomOp.generate_hdl_dynload'
  - Line 619: function 'HWCustomOp.accumulate_char_fxn'

📄 src/finn/custom_op/fpgadataflow/labelselect.py:
  - Line 1: module 'labelselect.py'
  - Line 41: function 'LabelSelect.__init__'
  - Line 55: function 'LabelSelect.get_nodeattr_types'
  - Line 72: function 'LabelSelect.get_normal_input_shape'
  - Line 78: function 'LabelSelect.get_folded_input_shape'
  - Line 87: function 'LabelSelect.get_normal_output_shape'
  - Line 93: function 'LabelSelect.get_folded_output_shape'
  - Line 99: function 'LabelSelect.make_shape_compatible_op'
  - Line 114: function 'LabelSelect.infer_node_datatype'
  - Line 123: function 'LabelSelect.verify_node'
  - Line 147: function 'LabelSelect.get_number_output_values'
  - Line 150: function 'LabelSelect.execute_node'
  - Line 180: function 'LabelSelect.get_exp_cycles'
  - Line 187: function 'LabelSelect.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/matrixvectoractivation.py:
  - Line 1: module 'matrixvectoractivation.py'
  - Line 58: function 'MVAU.__init__'
  - Line 61: function 'MVAU.get_nodeattr_types'
  - Line 134: function 'MVAU.execute_node'
  - Line 176: function 'MVAU.verify_node'
  - Line 231: function 'MVAU.infer_node_datatype'
  - Line 265: function 'MVAU.get_instream_width'
  - Line 298: function 'MVAU.get_outstream_width'
  - Line 303: function 'MVAU.get_folded_input_shape'
  - Line 329: function 'MVAU.get_folded_output_shape'
  - Line 337: function 'MVAU.get_normal_input_shape'
  - Line 349: function 'MVAU.get_normal_output_shape'
  - Line 375: function 'MVAU.uram_estimation'
  - Line 437: function 'MVAU.bram_efficiency_estimation'
  - Line 463: function 'MVAU.get_exp_cycles'
  - Line 788: function 'MVAU.generate_params'
  - Line 863: function 'MVAU.get_op_and_param_counts'
  - Line 887: function 'MVAU.get_verilog_top_module_intf_names'
  - Line 913: function 'MVAU.code_generation_ipi'
  - Line 1098: function 'MVAU.get_tree_model'
  - Line 1147: function 'MVAU.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/pool.py:
  - Line 233: function 'Pool.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/replicate_stream.py:
  - Line 1: module 'replicate_stream.py'
  - Line 27: class 'ReplicateStream'
  - Line 29: function 'ReplicateStream.__init__'
  - Line 40: function 'ReplicateStream.get_nodeattr_types'
  - Line 70: function 'ReplicateStream.num'
  - Line 75: function 'ReplicateStream.dtype'
  - Line 81: function 'ReplicateStream.num_elems'
  - Line 86: function 'ReplicateStream.pe'
  - Line 91: function 'ReplicateStream.num_inputs'
  - Line 97: function 'ReplicateStream.make_shape_compatible_op'
  - Line 113: function 'ReplicateStream.infer_node_datatype'
  - Line 132: function 'ReplicateStream._execute_node_python'
  - Line 143: function 'ReplicateStream._execute_node_cppsim'
  - Line 150: function 'ReplicateStream.execute_node'
  - Line 160: function 'ReplicateStream.verify_node'
  - Line 167: function 'ReplicateStream.get_input_datatype'
  - Line 172: function 'ReplicateStream.get_output_datatype'
  - Line 177: function 'ReplicateStream.get_normal_input_shape'
  - Line 183: function 'ReplicateStream.get_normal_output_shape'
  - Line 189: function 'ReplicateStream.get_folded_input_shape'
  - Line 196: function 'ReplicateStream.get_folded_output_shape'
  - Line 203: function 'ReplicateStream.get_instream_width'
  - Line 213: function 'ReplicateStream.get_outstream_width'
  - Line 224: function 'ReplicateStream.get_number_output_values'
  - Line 237: function 'ReplicateStream.get_exp_cycles'

📄 src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py:
  - Line 1: module 'streamingdatawidthconverter.py'
  - Line 44: function 'StreamingDataWidthConverter.get_nodeattr_types'
  - Line 68: function 'StreamingDataWidthConverter.get_normal_input_shape'
  - Line 72: function 'StreamingDataWidthConverter.get_normal_output_shape'
  - Line 76: function 'StreamingDataWidthConverter.get_iowidth_lcm'
  - Line 81: function 'StreamingDataWidthConverter.needs_lcm'
  - Line 88: function 'StreamingDataWidthConverter.check_divisible_iowidths'
  - Line 91: function 'StreamingDataWidthConverter.get_folded_input_shape'
  - Line 111: function 'StreamingDataWidthConverter.get_folded_output_shape'
  - Line 132: function 'StreamingDataWidthConverter.get_number_input_values'
  - Line 136: function 'StreamingDataWidthConverter.get_number_output_values'
  - Line 140: function 'StreamingDataWidthConverter.get_instream_width'
  - Line 144: function 'StreamingDataWidthConverter.get_outstream_width'
  - Line 148: function 'StreamingDataWidthConverter.infer_node_datatype'
  - Line 162: function 'StreamingDataWidthConverter.verify_node'
  - Line 179: function 'StreamingDataWidthConverter.execute_node'
  - Line 190: function 'StreamingDataWidthConverter.get_exp_cycles'
  - Line 222: function 'StreamingDataWidthConverter.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/thresholding.py:
  - Line 384: function 'Thresholding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/vectorvectoractivation.py:
  - Line 1067: function 'VVAU.get_tree_model'
  - Line 1122: function 'VVAU.derive_token_access_vectors'

📄 src/finn/templates/python_driver/driver.py:
  - Line 881: function 'FINNLiveFIFOOverlay.ctrl_read'
  - Line 893: function 'FINNLiveFIFOOverlay.ctrl_write'

📄 src/finn/transformation/fpgadataflow/derive_characteristic.py:
  - Line 1: module 'derive_characteristic.py'
  - Line 45: class 'JustInTimeSynthesizeParallel'
  - Line 46: function 'JustInTimeSynthesizeParallel.__init__'
  - Line 52: function 'JustInTimeSynthesizeParallel.applyNodeLocal'
  - Line 95: class 'JustInTimeSynthesize'
  - Line 96: function 'JustInTimeSynthesize.__init__'
  - Line 102: function 'JustInTimeSynthesize.apply'
  - Line 159: function 'DeriveTokenAccessVectors.__init__'
  - Line 179: function 'DeriveTokenAccessVectors.applyNodeLocal'
  - Line 209: function 'DeriveTokenAccessVectors.apply'
  - Line 227: function 'LocalStretchCharacteristicFunctions.__init__'
  - Line 232: function 'LocalStretchCharacteristicFunctions.applyNodeLocal'
  - Line 324: function 'get_top_producer_period'
  - Line 342: function 'get_top_consumer_period'
  - Line 408: function 'get_nodes_until_converging'
  - Line 419: function 'get_throughput'
  - Line 441: function 'get_parent_throughput'
  - Line 452: function 'get_parent'
  - Line 462: function 'get_consumer'
  - Line 468: function 'get_consumer_throughput'
  - Line 479: function 'get_true_period'
  - Line 486: function 'get_branch_nodes'
  - Line 494: function 'get_branch_volume'
  - Line 537: function 'calculate_peak_volume_delta'
  - Line 594: function 'compute_node_latency_init_periods'
  - Line 601: function 'max_dist'
  - Line 635: function 'get_full_branch_latency'
  - Line 642: function 'assign_extra_fifo_volume'
  - Line 751: function 'HandleBranches.__init__'
  - Line 756: function 'HandleBranches.apply'
  - Line 783: function 'ProducerDelayCharacteristicFunctions.__init__'
  - Line 788: function 'ProducerDelayCharacteristicFunctions.applyNodeLocal'
  - Line 858: function 'DelayCharacteristicFunctions.__init__'
  - Line 863: function 'DelayCharacteristicFunctions.applyNodeLocal'
  - Line 945: function 'inter_token_gaps'
  - Line 964: function 'remove_trailing_duplicates_keep_one'
  - Line 979: function 'remove_leading_duplicates_keep_one'
  - Line 1001: function 'DeriveFIFOSizes.__init__'
  - Line 1029: function 'DeriveFIFOSizes.apply'

📄 src/finn/util/basic.py:
  - Line 410: function 'get_driver_shapes'
  - Line 502: function 'stretch'
  - Line 510: class 'Characteristic_Node'
  - Line 511: function 'Characteristic_Node.__init__'
  - Line 520: function 'Characteristic_Node.sum'
  - Line 581: function 'compress_numpy_to_string'
  - Line 597: function 'decompress_string_to_numpy'
  - Line 609: function 'compute_total_model_fifo_size'

Total missing docstrings: 332

@github-actions
Copy link
Copy Markdown

📋 Docstring Check Report

Checked files:

  • ci/collect.py
  • src/finn/analysis/fpgadataflow/dataflow_performance.py
  • src/finn/builder/build_dataflow_config.py
  • src/finn/builder/build_dataflow_steps.py
  • src/finn/custom_op/fpgadataflow/addstreams.py
  • src/finn/custom_op/fpgadataflow/attention.py
  • src/finn/custom_op/fpgadataflow/channelwise_op.py
  • src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py
  • src/finn/custom_op/fpgadataflow/duplicatestreams.py
  • src/finn/custom_op/fpgadataflow/elementwise_binary.py
  • src/finn/custom_op/fpgadataflow/fmpadding.py
  • src/finn/custom_op/fpgadataflow/hls/attention_hls.py
  • src/finn/custom_op/fpgadataflow/hls/replicate_stream_hls.py
  • src/finn/custom_op/fpgadataflow/hlsbackend.py
  • src/finn/custom_op/fpgadataflow/hwcustomop.py
  • src/finn/custom_op/fpgadataflow/labelselect.py
  • src/finn/custom_op/fpgadataflow/matrixvectoractivation.py
  • src/finn/custom_op/fpgadataflow/pool.py
  • src/finn/custom_op/fpgadataflow/replicate_stream.py
  • src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py
  • src/finn/custom_op/fpgadataflow/thresholding.py
  • src/finn/custom_op/fpgadataflow/vectorvectoractivation.py
  • src/finn/templates/python_driver/driver.py
  • src/finn/transformation/fpgadataflow/derive_characteristic.py
  • src/finn/transformation/fpgadataflow/make_zynq_proj.py
  • src/finn/util/basic.py
  • tests/fpgadataflow/test_convert_to_hw_pool_batch.py
  • tests/fpgadataflow/test_fifosizing.py
  • tests/fpgadataflow/test_fpgadataflow_attention.py
  • tests/fpgadataflow/test_fpgadataflow_channelwise_ops.py
  • tests/fpgadataflow/test_fpgadataflow_convinputgenerator.py
  • tests/fpgadataflow/test_fpgadataflow_downsampler.py
  • tests/fpgadataflow/test_fpgadataflow_dwc.py
  • tests/fpgadataflow/test_fpgadataflow_fmpadding.py
  • tests/fpgadataflow/test_fpgadataflow_labelselect.py
  • tests/fpgadataflow/test_fpgadataflow_mvau.py
  • tests/fpgadataflow/test_fpgadataflow_thresholding.py
  • tests/fpgadataflow/test_fpgadataflow_vvau.py
  • tests/testing_util/test.py

Docstring check failed!

Missing Docstrings Details:

  • ci/collect.py
  • src/finn/analysis/fpgadataflow/dataflow_performance.py
  • src/finn/builder/build_dataflow_config.py
  • src/finn/builder/build_dataflow_steps.py
  • src/finn/custom_op/fpgadataflow/addstreams.py
  • src/finn/custom_op/fpgadataflow/attention.py
  • src/finn/custom_op/fpgadataflow/channelwise_op.py
  • src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py
  • src/finn/custom_op/fpgadataflow/duplicatestreams.py
  • src/finn/custom_op/fpgadataflow/elementwise_binary.py
  • src/finn/custom_op/fpgadataflow/fmpadding.py
  • src/finn/custom_op/fpgadataflow/hls/attention_hls.py
  • src/finn/custom_op/fpgadataflow/hls/replicate_stream_hls.py
  • src/finn/custom_op/fpgadataflow/hlsbackend.py
  • src/finn/custom_op/fpgadataflow/hwcustomop.py
  • src/finn/custom_op/fpgadataflow/labelselect.py
  • src/finn/custom_op/fpgadataflow/matrixvectoractivation.py
  • src/finn/custom_op/fpgadataflow/pool.py
  • src/finn/custom_op/fpgadataflow/replicate_stream.py
  • src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py
  • src/finn/custom_op/fpgadataflow/thresholding.py
  • src/finn/custom_op/fpgadataflow/vectorvectoractivation.py
  • src/finn/templates/python_driver/driver.py
  • src/finn/transformation/fpgadataflow/derive_characteristic.py
  • src/finn/transformation/fpgadataflow/make_zynq_proj.py
  • src/finn/util/basic.py

📄 src/finn/analysis/fpgadataflow/dataflow_performance.py:

    • Line 1: module 'dataflow_performance.py'

📄 src/finn/custom_op/fpgadataflow/addstreams.py:

    • Line 1: module 'addstreams.py'
    • Line 41: function 'AddStreams.init'
    • Line 44: function 'AddStreams.get_nodeattr_types'
    • Line 62: function 'AddStreams.get_normal_input_shape'
    • Line 68: function 'AddStreams.get_folded_input_shape'
    • Line 76: function 'AddStreams.get_normal_output_shape'
    • Line 79: function 'AddStreams.get_folded_output_shape'
    • Line 82: function 'AddStreams.infer_node_datatype'
    • Line 137: function 'AddStreams.get_exp_cycles'
    • Line 141: function 'AddStreams.execute_node'
    • Line 153: function 'AddStreams.prepare_tree_model'
    • Line 161: function 'AddStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/attention.py:

    • Line 1: module 'attention.py'
    • Line 31: function 'softmax'
    • Line 49: class 'ScaledDotProductAttention'
    • Line 51: function 'ScaledDotProductAttention.init'
    • Line 56: function 'ScaledDotProductAttention.get_nodeattr_types'
    • Line 172: function 'ScaledDotProductAttention.shapes'
    • Line 180: function 'ScaledDotProductAttention.folds'
    • Line 188: function 'ScaledDotProductAttention.is_valid_folding'
    • Line 200: function 'ScaledDotProductAttention.iterations'
    • Line 207: function 'ScaledDotProductAttention.make_shape_compatible_op'
    • Line 226: function 'ScaledDotProductAttention.infer_node_datatype'
    • Line 287: function 'ScaledDotProductAttention._execute_node_python'
    • Line 299: function 'ScaledDotProductAttention.act_qk_matmul'
    • Line 316: function 'ScaledDotProductAttention.act_a_softmax'
    • Line 334: function 'ScaledDotProductAttention.act_av_matmul'
    • Line 410: function 'ScaledDotProductAttention._execute_node_cppsim'
    • Line 417: function 'ScaledDotProductAttention._execute_node_rtlsim'
    • Line 424: function 'ScaledDotProductAttention.execute_node'
    • Line 434: function 'ScaledDotProductAttention.verify_node'
    • Line 438: function 'ScaledDotProductAttention.get_input_datatype'
    • Line 477: function 'ScaledDotProductAttention.get_output_datatype'
    • Line 484: function 'ScaledDotProductAttention.get_normal_input_shape'
    • Line 533: function 'ScaledDotProductAttention.get_normal_output_shape'
    • Line 541: function 'ScaledDotProductAttention.get_normal_attention_shape'
    • Line 547: function 'ScaledDotProductAttention.get_folded_input_shape'
    • Line 579: function 'ScaledDotProductAttention.get_folded_output_shape'
    • Line 590: function 'ScaledDotProductAttention.get_folded_attention_shape'
    • Line 600: function 'ScaledDotProductAttention.get_instream_width'
    • Line 619: function 'ScaledDotProductAttention.get_outstream_width'
    • Line 629: function 'ScaledDotProductAttention.minimize_accumulator_width'
    • Line 716: function 'ScaledDotProductAttention.get_number_input_values'
    • Line 723: function 'ScaledDotProductAttention.get_number_output_values'
    • Line 733: function 'ScaledDotProductAttention.get_input_name_by_name'
    • Line 772: function 'ScaledDotProductAttention.get_exp_cycles'

📄 src/finn/custom_op/fpgadataflow/channelwise_op.py:

    • Line 1: module 'channelwise_op.py'
    • Line 80: function 'ChannelwiseOp.init'
    • Line 83: function 'ChannelwiseOp.get_nodeattr_types'
    • Line 112: function 'ChannelwiseOp.infer_node_datatype'
    • Line 162: function 'ChannelwiseOp.get_instream_width'
    • Line 172: function 'ChannelwiseOp.get_outstream_width'
    • Line 176: function 'ChannelwiseOp.get_folded_input_shape'
    • Line 189: function 'ChannelwiseOp.get_folded_output_shape'
    • Line 193: function 'ChannelwiseOp.get_normal_input_shape'
    • Line 206: function 'ChannelwiseOp.get_normal_output_shape'
    • Line 210: function 'ChannelwiseOp.get_exp_cycles'
    • Line 214: function 'ChannelwiseOp.execute_node'
    • Line 245: function 'ChannelwiseOp.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py:

    • Line 1: module 'convolutioninputgenerator.py'
    • Line 50: function 'ConvolutionInputGenerator.init'
    • Line 53: function 'ConvolutionInputGenerator.get_nodeattr_types'
    • Line 88: function 'ConvolutionInputGenerator.get_normal_input_shape'
    • Line 94: function 'ConvolutionInputGenerator.get_folded_input_shape'
    • Line 103: function 'ConvolutionInputGenerator.get_normal_output_shape'
    • Line 115: function 'ConvolutionInputGenerator.get_folded_output_shape'
    • Line 134: function 'ConvolutionInputGenerator.infer_node_datatype'
    • Line 179: function 'ConvolutionInputGenerator.get_outstream_width'
    • Line 188: function 'ConvolutionInputGenerator.get_1d_conv_attrs_normalized'
    • Line 214: function 'ConvolutionInputGenerator.get_exp_cycles'
    • Line 217: function 'ConvolutionInputGenerator.bram_estimation'
    • Line 220: function 'ConvolutionInputGenerator.lut_estimation'
    • Line 223: function 'ConvolutionInputGenerator.uram_estimation'
    • Line 226: function 'ConvolutionInputGenerator.execute_node'
    • Line 265: function 'ConvolutionInputGenerator.get_tree_model_uniform_distribution_based'
    • Line 266: function 'ConvolutionInputGenerator.distribute_outputs_uniform'
    • Line 563: function 'ConvolutionInputGenerator.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/duplicatestreams.py:

    • Line 1: module 'duplicatestreams.py'
    • Line 40: function 'DuplicateStreams.init'
    • Line 43: function 'DuplicateStreams.get_nodeattr_types'
    • Line 60: function 'DuplicateStreams.get_num_output_streams'
    • Line 63: function 'DuplicateStreams.get_normal_input_shape'
    • Line 69: function 'DuplicateStreams.get_folded_input_shape'
    • Line 78: function 'DuplicateStreams.get_normal_output_shape'
    • Line 83: function 'DuplicateStreams.get_folded_output_shape'
    • Line 88: function 'DuplicateStreams.make_shape_compatible_op'
    • Line 93: function 'DuplicateStreams.infer_node_datatype'
    • Line 130: function 'DuplicateStreams.get_number_output_values'
    • Line 136: function 'DuplicateStreams.get_exp_cycles'
    • Line 140: function 'DuplicateStreams.execute_node'
    • Line 152: function 'DuplicateStreams.get_tree_model'
    • Line 162: function 'DuplicateStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/elementwise_binary.py:

    • Line 1: module 'elementwise_binary.py'
    • Line 44: class 'ElementwiseBinaryOperation'
    • Line 51: function 'ElementwiseBinaryOperation.npy_op'
    • Line 56: function 'ElementwiseBinaryOperation.cpp_op'
    • Line 61: function 'ElementwiseBinaryOperation.rtl_op'
    • Line 65: function 'ElementwiseBinaryOperation.init'
    • Line 70: function 'ElementwiseBinaryOperation.get_nodeattr_types'
    • Line 119: function 'ElementwiseBinaryOperation.lhs_dtype'
    • Line 125: function 'ElementwiseBinaryOperation.rhs_dtype'
    • Line 131: function 'ElementwiseBinaryOperation.out_dtype'
    • Line 137: function 'ElementwiseBinaryOperation.lhs_shape'
    • Line 142: function 'ElementwiseBinaryOperation.rhs_shape'
    • Line 147: function 'ElementwiseBinaryOperation.out_shape'
    • Line 152: function 'ElementwiseBinaryOperation.lhs_style'
    • Line 157: function 'ElementwiseBinaryOperation.rhs_style'
    • Line 162: function 'ElementwiseBinaryOperation.pe'
    • Line 167: function 'ElementwiseBinaryOperation.broadcast_last_axis'
    • Line 173: function 'ElementwiseBinaryOperation.make_shape_compatible_op'
    • Line 193: function 'ElementwiseBinaryOperation.infer_node_datatype'
    • Line 215: function 'ElementwiseBinaryOperation.execute_node'
    • Line 240: function 'ElementwiseBinaryOperation.get_input_datatype'
    • Line 245: function 'ElementwiseBinaryOperation.get_output_datatype'
    • Line 250: function 'ElementwiseBinaryOperation.get_normal_input_shape'
    • Line 255: function 'ElementwiseBinaryOperation.get_normal_output_shape'
    • Line 260: function 'ElementwiseBinaryOperation.get_folded_input_shape'
    • Line 274: function 'ElementwiseBinaryOperation.get_folded_output_shape'
    • Line 288: function 'ElementwiseBinaryOperation.get_instream_width'
    • Line 310: function 'ElementwiseBinaryOperation.get_outstream_width'
    • Line 321: function 'ElementwiseBinaryOperation.minimize_accumulator_width'
    • Line 344: function 'ElementwiseBinaryOperation._derive_out_dtype'
    • Line 353: function 'ElementwiseBinaryOperation.minimize_weight_bit_width'
    • Line 437: function 'ElementwiseBinaryOperation.get_exp_cycles'
    • Line 445: class 'ElementwiseAdd'
    • Line 451: function 'ElementwiseAdd._derive_out_dtype'
    • Line 485: class 'ElementwiseSub'
    • Line 491: function 'ElementwiseSub._derive_out_dtype'
    • Line 521: class 'ElementwiseMul'
    • Line 527: function 'ElementwiseMul._derive_out_dtype'
    • Line 542: class 'ElementwiseDiv'
    • Line 549: function 'ElementwiseDiv._derive_out_dtype'
    • Line 568: class 'ElementwiseAnd'
    • Line 574: function 'ElementwiseAnd._derive_out_dtype'
    • Line 582: class 'ElementwiseOr'
    • Line 588: function 'ElementwiseOr._derive_out_dtype'
    • Line 596: class 'ElementwiseXor'
    • Line 602: function 'ElementwiseXor._derive_out_dtype'
    • Line 610: class 'ElementwiseEqual'
    • Line 616: function 'ElementwiseEqual._derive_out_dtype'
    • Line 624: class 'ElementwiseLess'
    • Line 630: function 'ElementwiseLess._derive_out_dtype'
    • Line 638: class 'ElementwiseLessOrEqual'
    • Line 644: function 'ElementwiseLessOrEqual._derive_out_dtype'
    • Line 652: class 'ElementwiseGreater'
    • Line 658: function 'ElementwiseGreater._derive_out_dtype'
    • Line 667: class 'ElementwiseGreaterOrEqual'
    • Line 673: function 'ElementwiseGreaterOrEqual._derive_out_dtype'
    • Line 681: class 'ElementwiseBitwiseAnd'
    • Line 687: function 'ElementwiseBitwiseAnd._derive_out_dtype'
    • Line 703: class 'ElementwiseBitwiseOr'
    • Line 709: function 'ElementwiseBitwiseOr._derive_out_dtype'
    • Line 725: class 'ElementwiseBitwiseXor'
    • Line 731: function 'ElementwiseBitwiseXor._derive_out_dtype'
    • Line 747: class 'ElementwiseBitShift'
    • Line 749: function 'ElementwiseBitShift.get_nodeattr_types'
    • Line 763: function 'ElementwiseBitShift.npy_op'
    • Line 768: function 'ElementwiseBitShift.cpp_op'
    • Line 773: function 'ElementwiseBitShift.rtl_op'
    • Line 777: function 'ElementwiseBitShift._derive_out_dtype'
    • Line 794: class 'ElementwiseMax'
    • Line 796: function 'ElementwiseMax.npy_op'
    • Line 801: function 'ElementwiseMax.cpp_op'
    • Line 807: function 'ElementwiseMax.rtl_op'
    • Line 810: function 'ElementwiseMax._derive_out_dtype'

📄 src/finn/custom_op/fpgadataflow/fmpadding.py:

    • Line 1: module 'fmpadding.py'
    • Line 41: function 'FMPadding.init'
    • Line 44: function 'FMPadding.get_nodeattr_types'
    • Line 76: function 'FMPadding.get_exp_cycles'
    • Line 84: function 'FMPadding.get_normal_input_shape'
    • Line 90: function 'FMPadding.get_normal_output_shape'
    • Line 97: function 'FMPadding.get_folded_input_shape'
    • Line 106: function 'FMPadding.get_folded_output_shape'
    • Line 115: function 'FMPadding.make_shape_compatible_op'
    • Line 122: function 'FMPadding.infer_node_datatype'
    • Line 135: function 'FMPadding.verify_node'
    • Line 150: function 'FMPadding.get_instream_width'
    • Line 155: function 'FMPadding.get_outstream_width'
    • Line 160: function 'FMPadding.get_number_output_values'
    • Line 164: function 'FMPadding.execute_node'
    • Line 175: function 'FMPadding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/hls/replicate_stream_hls.py:

    • Line 1: module 'replicate_stream_hls.py'
    • Line 15: class 'ReplicateStream_hls'
    • Line 20: function 'ReplicateStream_hls.get_nodeattr_types'
    • Line 30: function 'ReplicateStream_hls.get_ap_int_max_w'
    • Line 46: function 'ReplicateStream_hls.global_includes'
    • Line 51: function 'ReplicateStream_hls.defines'
    • Line 74: function 'ReplicateStream_hls.docompute'
    • Line 76: function 'ReplicateStream_hls.out'
    • Line 100: function 'ReplicateStream_hls.blackboxfunction'
    • Line 119: function 'ReplicateStream_hls.pragmas'
    • Line 138: function 'ReplicateStream_hls.get_verilog_top_module_intf_names'

📄 src/finn/custom_op/fpgadataflow/hwcustomop.py:

    • Line 1: module 'hwcustomop.py'
    • Line 47: function 'HWCustomOp.init'
    • Line 51: function 'HWCustomOp.get_nodeattr_types'
    • Line 102: function 'HWCustomOp.make_shape_compatible_op'
    • Line 313: function 'HWCustomOp.derive_token_access_vectors'
    • Line 343: function 'HWCustomOp.derive_token_access_vectors_using_tree_model'
    • Line 510: function 'HWCustomOp.generate_hdl_dynload'
    • Line 619: function 'HWCustomOp.accumulate_char_fxn'

📄 src/finn/custom_op/fpgadataflow/labelselect.py:

    • Line 1: module 'labelselect.py'
    • Line 41: function 'LabelSelect.init'
    • Line 55: function 'LabelSelect.get_nodeattr_types'
    • Line 72: function 'LabelSelect.get_normal_input_shape'
    • Line 78: function 'LabelSelect.get_folded_input_shape'
    • Line 87: function 'LabelSelect.get_normal_output_shape'
    • Line 93: function 'LabelSelect.get_folded_output_shape'
    • Line 99: function 'LabelSelect.make_shape_compatible_op'
    • Line 114: function 'LabelSelect.infer_node_datatype'
    • Line 123: function 'LabelSelect.verify_node'
    • Line 147: function 'LabelSelect.get_number_output_values'
    • Line 150: function 'LabelSelect.execute_node'
    • Line 180: function 'LabelSelect.get_exp_cycles'
    • Line 187: function 'LabelSelect.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/matrixvectoractivation.py:

    • Line 1: module 'matrixvectoractivation.py'
    • Line 58: function 'MVAU.init'
    • Line 61: function 'MVAU.get_nodeattr_types'
    • Line 134: function 'MVAU.execute_node'
    • Line 176: function 'MVAU.verify_node'
    • Line 231: function 'MVAU.infer_node_datatype'
    • Line 265: function 'MVAU.get_instream_width'
    • Line 298: function 'MVAU.get_outstream_width'
    • Line 303: function 'MVAU.get_folded_input_shape'
    • Line 329: function 'MVAU.get_folded_output_shape'
    • Line 337: function 'MVAU.get_normal_input_shape'
    • Line 349: function 'MVAU.get_normal_output_shape'
    • Line 375: function 'MVAU.uram_estimation'
    • Line 437: function 'MVAU.bram_efficiency_estimation'
    • Line 463: function 'MVAU.get_exp_cycles'
    • Line 788: function 'MVAU.generate_params'
    • Line 863: function 'MVAU.get_op_and_param_counts'
    • Line 887: function 'MVAU.get_verilog_top_module_intf_names'
    • Line 913: function 'MVAU.code_generation_ipi'
    • Line 1098: function 'MVAU.get_tree_model'
    • Line 1147: function 'MVAU.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/pool.py:

    • Line 233: function 'Pool.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/replicate_stream.py:

    • Line 1: module 'replicate_stream.py'
    • Line 27: class 'ReplicateStream'
    • Line 29: function 'ReplicateStream.init'
    • Line 40: function 'ReplicateStream.get_nodeattr_types'
    • Line 70: function 'ReplicateStream.num'
    • Line 75: function 'ReplicateStream.dtype'
    • Line 81: function 'ReplicateStream.num_elems'
    • Line 86: function 'ReplicateStream.pe'
    • Line 91: function 'ReplicateStream.num_inputs'
    • Line 97: function 'ReplicateStream.make_shape_compatible_op'
    • Line 113: function 'ReplicateStream.infer_node_datatype'
    • Line 132: function 'ReplicateStream._execute_node_python'
    • Line 143: function 'ReplicateStream._execute_node_cppsim'
    • Line 150: function 'ReplicateStream.execute_node'
    • Line 160: function 'ReplicateStream.verify_node'
    • Line 167: function 'ReplicateStream.get_input_datatype'
    • Line 172: function 'ReplicateStream.get_output_datatype'
    • Line 177: function 'ReplicateStream.get_normal_input_shape'
    • Line 183: function 'ReplicateStream.get_normal_output_shape'
    • Line 189: function 'ReplicateStream.get_folded_input_shape'
    • Line 196: function 'ReplicateStream.get_folded_output_shape'
    • Line 203: function 'ReplicateStream.get_instream_width'
    • Line 213: function 'ReplicateStream.get_outstream_width'
    • Line 224: function 'ReplicateStream.get_number_output_values'
    • Line 237: function 'ReplicateStream.get_exp_cycles'

📄 src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py:

    • Line 1: module 'streamingdatawidthconverter.py'
    • Line 44: function 'StreamingDataWidthConverter.get_nodeattr_types'
    • Line 68: function 'StreamingDataWidthConverter.get_normal_input_shape'
    • Line 72: function 'StreamingDataWidthConverter.get_normal_output_shape'
    • Line 76: function 'StreamingDataWidthConverter.get_iowidth_lcm'
    • Line 81: function 'StreamingDataWidthConverter.needs_lcm'
    • Line 88: function 'StreamingDataWidthConverter.check_divisible_iowidths'
    • Line 91: function 'StreamingDataWidthConverter.get_folded_input_shape'
    • Line 111: function 'StreamingDataWidthConverter.get_folded_output_shape'
    • Line 132: function 'StreamingDataWidthConverter.get_number_input_values'
    • Line 136: function 'StreamingDataWidthConverter.get_number_output_values'
    • Line 140: function 'StreamingDataWidthConverter.get_instream_width'
    • Line 144: function 'StreamingDataWidthConverter.get_outstream_width'
    • Line 148: function 'StreamingDataWidthConverter.infer_node_datatype'
    • Line 162: function 'StreamingDataWidthConverter.verify_node'
    • Line 179: function 'StreamingDataWidthConverter.execute_node'
    • Line 190: function 'StreamingDataWidthConverter.get_exp_cycles'
    • Line 222: function 'StreamingDataWidthConverter.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/thresholding.py:

    • Line 384: function 'Thresholding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/vectorvectoractivation.py:

    • Line 1067: function 'VVAU.get_tree_model'
    • Line 1122: function 'VVAU.derive_token_access_vectors'

📄 src/finn/templates/python_driver/driver.py:

    • Line 881: function 'FINNLiveFIFOOverlay.ctrl_read'
    • Line 893: function 'FINNLiveFIFOOverlay.ctrl_write'

📄 src/finn/transformation/fpgadataflow/derive_characteristic.py:

    • Line 1: module 'derive_characteristic.py'
    • Line 45: class 'JustInTimeSynthesizeParallel'
    • Line 46: function 'JustInTimeSynthesizeParallel.init'
    • Line 52: function 'JustInTimeSynthesizeParallel.applyNodeLocal'
    • Line 95: class 'JustInTimeSynthesize'
    • Line 96: function 'JustInTimeSynthesize.init'
    • Line 102: function 'JustInTimeSynthesize.apply'
    • Line 159: function 'DeriveTokenAccessVectors.init'
    • Line 179: function 'DeriveTokenAccessVectors.applyNodeLocal'
    • Line 209: function 'DeriveTokenAccessVectors.apply'
    • Line 227: function 'LocalStretchCharacteristicFunctions.init'
    • Line 232: function 'LocalStretchCharacteristicFunctions.applyNodeLocal'
    • Line 324: function 'get_top_producer_period'
    • Line 342: function 'get_top_consumer_period'
    • Line 408: function 'get_nodes_until_converging'
    • Line 419: function 'get_throughput'
    • Line 441: function 'get_parent_throughput'
    • Line 452: function 'get_parent'
    • Line 462: function 'get_consumer'
    • Line 468: function 'get_consumer_throughput'
    • Line 479: function 'get_true_period'
    • Line 486: function 'get_branch_nodes'
    • Line 494: function 'get_branch_volume'
    • Line 537: function 'calculate_peak_volume_delta'
    • Line 594: function 'compute_node_latency_init_periods'
    • Line 601: function 'max_dist'
    • Line 635: function 'get_full_branch_latency'
    • Line 642: function 'assign_extra_fifo_volume'
    • Line 751: function 'HandleBranches.init'
    • Line 756: function 'HandleBranches.apply'
    • Line 783: function 'ProducerDelayCharacteristicFunctions.init'
    • Line 788: function 'ProducerDelayCharacteristicFunctions.applyNodeLocal'
    • Line 858: function 'DelayCharacteristicFunctions.init'
    • Line 863: function 'DelayCharacteristicFunctions.applyNodeLocal'
    • Line 945: function 'inter_token_gaps'
    • Line 964: function 'remove_trailing_duplicates_keep_one'
    • Line 979: function 'remove_leading_duplicates_keep_one'
    • Line 1001: function 'DeriveFIFOSizes.init'
    • Line 1029: function 'DeriveFIFOSizes.apply'

📄 src/finn/util/basic.py:

    • Line 410: function 'get_driver_shapes'
    • Line 502: function 'stretch'
    • Line 510: class 'Characteristic_Node'
    • Line 511: function 'Characteristic_Node.init'
    • Line 520: function 'Characteristic_Node.sum'
    • Line 581: function 'compress_numpy_to_string'
    • Line 597: function 'decompress_string_to_numpy'
    • Line 609: function 'compute_total_model_fifo_size'

Total missing docstrings: 332

How to Fix:

Please add docstrings to the missing functions, classes, and modules listed above.

Docstring Guidelines:

  • All modules should have a module-level docstring
  • All public functions and methods should have docstrings
  • All private functions should have docstrings
  • All classes should have docstrings
  • Use triple quotes (""") for docstrings
  • Follow PEP 257 conventions
Raw output from docstring checker
Checking 26 specified Python file(s) (excluding tests folder):
  - ci/collect.py
  - src/finn/analysis/fpgadataflow/dataflow_performance.py
  - src/finn/builder/build_dataflow_config.py
  - src/finn/builder/build_dataflow_steps.py
  - src/finn/custom_op/fpgadataflow/addstreams.py
  - src/finn/custom_op/fpgadataflow/attention.py
  - src/finn/custom_op/fpgadataflow/channelwise_op.py
  - src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py
  - src/finn/custom_op/fpgadataflow/duplicatestreams.py
  - src/finn/custom_op/fpgadataflow/elementwise_binary.py
  - src/finn/custom_op/fpgadataflow/fmpadding.py
  - src/finn/custom_op/fpgadataflow/hls/attention_hls.py
  - src/finn/custom_op/fpgadataflow/hls/replicate_stream_hls.py
  - src/finn/custom_op/fpgadataflow/hlsbackend.py
  - src/finn/custom_op/fpgadataflow/hwcustomop.py
  - src/finn/custom_op/fpgadataflow/labelselect.py
  - src/finn/custom_op/fpgadataflow/matrixvectoractivation.py
  - src/finn/custom_op/fpgadataflow/pool.py
  - src/finn/custom_op/fpgadataflow/replicate_stream.py
  - src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py
  - src/finn/custom_op/fpgadataflow/thresholding.py
  - src/finn/custom_op/fpgadataflow/vectorvectoractivation.py
  - src/finn/templates/python_driver/driver.py
  - src/finn/transformation/fpgadataflow/derive_characteristic.py
  - src/finn/transformation/fpgadataflow/make_zynq_proj.py
  - src/finn/util/basic.py

❌ Missing docstrings found:

📄 src/finn/analysis/fpgadataflow/dataflow_performance.py:
  - Line 1: module 'dataflow_performance.py'

📄 src/finn/custom_op/fpgadataflow/addstreams.py:
  - Line 1: module 'addstreams.py'
  - Line 41: function 'AddStreams.__init__'
  - Line 44: function 'AddStreams.get_nodeattr_types'
  - Line 62: function 'AddStreams.get_normal_input_shape'
  - Line 68: function 'AddStreams.get_folded_input_shape'
  - Line 76: function 'AddStreams.get_normal_output_shape'
  - Line 79: function 'AddStreams.get_folded_output_shape'
  - Line 82: function 'AddStreams.infer_node_datatype'
  - Line 137: function 'AddStreams.get_exp_cycles'
  - Line 141: function 'AddStreams.execute_node'
  - Line 153: function 'AddStreams.prepare_tree_model'
  - Line 161: function 'AddStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/attention.py:
  - Line 1: module 'attention.py'
  - Line 31: function 'softmax'
  - Line 49: class 'ScaledDotProductAttention'
  - Line 51: function 'ScaledDotProductAttention.__init__'
  - Line 56: function 'ScaledDotProductAttention.get_nodeattr_types'
  - Line 172: function 'ScaledDotProductAttention.shapes'
  - Line 180: function 'ScaledDotProductAttention.folds'
  - Line 188: function 'ScaledDotProductAttention.is_valid_folding'
  - Line 200: function 'ScaledDotProductAttention.iterations'
  - Line 207: function 'ScaledDotProductAttention.make_shape_compatible_op'
  - Line 226: function 'ScaledDotProductAttention.infer_node_datatype'
  - Line 287: function 'ScaledDotProductAttention._execute_node_python'
  - Line 299: function 'ScaledDotProductAttention.act_qk_matmul'
  - Line 316: function 'ScaledDotProductAttention.act_a_softmax'
  - Line 334: function 'ScaledDotProductAttention.act_av_matmul'
  - Line 410: function 'ScaledDotProductAttention._execute_node_cppsim'
  - Line 417: function 'ScaledDotProductAttention._execute_node_rtlsim'
  - Line 424: function 'ScaledDotProductAttention.execute_node'
  - Line 434: function 'ScaledDotProductAttention.verify_node'
  - Line 438: function 'ScaledDotProductAttention.get_input_datatype'
  - Line 477: function 'ScaledDotProductAttention.get_output_datatype'
  - Line 484: function 'ScaledDotProductAttention.get_normal_input_shape'
  - Line 533: function 'ScaledDotProductAttention.get_normal_output_shape'
  - Line 541: function 'ScaledDotProductAttention.get_normal_attention_shape'
  - Line 547: function 'ScaledDotProductAttention.get_folded_input_shape'
  - Line 579: function 'ScaledDotProductAttention.get_folded_output_shape'
  - Line 590: function 'ScaledDotProductAttention.get_folded_attention_shape'
  - Line 600: function 'ScaledDotProductAttention.get_instream_width'
  - Line 619: function 'ScaledDotProductAttention.get_outstream_width'
  - Line 629: function 'ScaledDotProductAttention.minimize_accumulator_width'
  - Line 716: function 'ScaledDotProductAttention.get_number_input_values'
  - Line 723: function 'ScaledDotProductAttention.get_number_output_values'
  - Line 733: function 'ScaledDotProductAttention.get_input_name_by_name'
  - Line 772: function 'ScaledDotProductAttention.get_exp_cycles'

📄 src/finn/custom_op/fpgadataflow/channelwise_op.py:
  - Line 1: module 'channelwise_op.py'
  - Line 80: function 'ChannelwiseOp.__init__'
  - Line 83: function 'ChannelwiseOp.get_nodeattr_types'
  - Line 112: function 'ChannelwiseOp.infer_node_datatype'
  - Line 162: function 'ChannelwiseOp.get_instream_width'
  - Line 172: function 'ChannelwiseOp.get_outstream_width'
  - Line 176: function 'ChannelwiseOp.get_folded_input_shape'
  - Line 189: function 'ChannelwiseOp.get_folded_output_shape'
  - Line 193: function 'ChannelwiseOp.get_normal_input_shape'
  - Line 206: function 'ChannelwiseOp.get_normal_output_shape'
  - Line 210: function 'ChannelwiseOp.get_exp_cycles'
  - Line 214: function 'ChannelwiseOp.execute_node'
  - Line 245: function 'ChannelwiseOp.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py:
  - Line 1: module 'convolutioninputgenerator.py'
  - Line 50: function 'ConvolutionInputGenerator.__init__'
  - Line 53: function 'ConvolutionInputGenerator.get_nodeattr_types'
  - Line 88: function 'ConvolutionInputGenerator.get_normal_input_shape'
  - Line 94: function 'ConvolutionInputGenerator.get_folded_input_shape'
  - Line 103: function 'ConvolutionInputGenerator.get_normal_output_shape'
  - Line 115: function 'ConvolutionInputGenerator.get_folded_output_shape'
  - Line 134: function 'ConvolutionInputGenerator.infer_node_datatype'
  - Line 179: function 'ConvolutionInputGenerator.get_outstream_width'
  - Line 188: function 'ConvolutionInputGenerator.get_1d_conv_attrs_normalized'
  - Line 214: function 'ConvolutionInputGenerator.get_exp_cycles'
  - Line 217: function 'ConvolutionInputGenerator.bram_estimation'
  - Line 220: function 'ConvolutionInputGenerator.lut_estimation'
  - Line 223: function 'ConvolutionInputGenerator.uram_estimation'
  - Line 226: function 'ConvolutionInputGenerator.execute_node'
  - Line 265: function 'ConvolutionInputGenerator.get_tree_model_uniform_distribution_based'
  - Line 266: function 'ConvolutionInputGenerator.distribute_outputs_uniform'
  - Line 563: function 'ConvolutionInputGenerator.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/duplicatestreams.py:
  - Line 1: module 'duplicatestreams.py'
  - Line 40: function 'DuplicateStreams.__init__'
  - Line 43: function 'DuplicateStreams.get_nodeattr_types'
  - Line 60: function 'DuplicateStreams.get_num_output_streams'
  - Line 63: function 'DuplicateStreams.get_normal_input_shape'
  - Line 69: function 'DuplicateStreams.get_folded_input_shape'
  - Line 78: function 'DuplicateStreams.get_normal_output_shape'
  - Line 83: function 'DuplicateStreams.get_folded_output_shape'
  - Line 88: function 'DuplicateStreams.make_shape_compatible_op'
  - Line 93: function 'DuplicateStreams.infer_node_datatype'
  - Line 130: function 'DuplicateStreams.get_number_output_values'
  - Line 136: function 'DuplicateStreams.get_exp_cycles'
  - Line 140: function 'DuplicateStreams.execute_node'
  - Line 152: function 'DuplicateStreams.get_tree_model'
  - Line 162: function 'DuplicateStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/elementwise_binary.py:
  - Line 1: module 'elementwise_binary.py'
  - Line 44: class 'ElementwiseBinaryOperation'
  - Line 51: function 'ElementwiseBinaryOperation.npy_op'
  - Line 56: function 'ElementwiseBinaryOperation.cpp_op'
  - Line 61: function 'ElementwiseBinaryOperation.rtl_op'
  - Line 65: function 'ElementwiseBinaryOperation.__init__'
  - Line 70: function 'ElementwiseBinaryOperation.get_nodeattr_types'
  - Line 119: function 'ElementwiseBinaryOperation.lhs_dtype'
  - Line 125: function 'ElementwiseBinaryOperation.rhs_dtype'
  - Line 131: function 'ElementwiseBinaryOperation.out_dtype'
  - Line 137: function 'ElementwiseBinaryOperation.lhs_shape'
  - Line 142: function 'ElementwiseBinaryOperation.rhs_shape'
  - Line 147: function 'ElementwiseBinaryOperation.out_shape'
  - Line 152: function 'ElementwiseBinaryOperation.lhs_style'
  - Line 157: function 'ElementwiseBinaryOperation.rhs_style'
  - Line 162: function 'ElementwiseBinaryOperation.pe'
  - Line 167: function 'ElementwiseBinaryOperation.broadcast_last_axis'
  - Line 173: function 'ElementwiseBinaryOperation.make_shape_compatible_op'
  - Line 193: function 'ElementwiseBinaryOperation.infer_node_datatype'
  - Line 215: function 'ElementwiseBinaryOperation.execute_node'
  - Line 240: function 'ElementwiseBinaryOperation.get_input_datatype'
  - Line 245: function 'ElementwiseBinaryOperation.get_output_datatype'
  - Line 250: function 'ElementwiseBinaryOperation.get_normal_input_shape'
  - Line 255: function 'ElementwiseBinaryOperation.get_normal_output_shape'
  - Line 260: function 'ElementwiseBinaryOperation.get_folded_input_shape'
  - Line 274: function 'ElementwiseBinaryOperation.get_folded_output_shape'
  - Line 288: function 'ElementwiseBinaryOperation.get_instream_width'
  - Line 310: function 'ElementwiseBinaryOperation.get_outstream_width'
  - Line 321: function 'ElementwiseBinaryOperation.minimize_accumulator_width'
  - Line 344: function 'ElementwiseBinaryOperation._derive_out_dtype'
  - Line 353: function 'ElementwiseBinaryOperation.minimize_weight_bit_width'
  - Line 437: function 'ElementwiseBinaryOperation.get_exp_cycles'
  - Line 445: class 'ElementwiseAdd'
  - Line 451: function 'ElementwiseAdd._derive_out_dtype'
  - Line 485: class 'ElementwiseSub'
  - Line 491: function 'ElementwiseSub._derive_out_dtype'
  - Line 521: class 'ElementwiseMul'
  - Line 527: function 'ElementwiseMul._derive_out_dtype'
  - Line 542: class 'ElementwiseDiv'
  - Line 549: function 'ElementwiseDiv._derive_out_dtype'
  - Line 568: class 'ElementwiseAnd'
  - Line 574: function 'ElementwiseAnd._derive_out_dtype'
  - Line 582: class 'ElementwiseOr'
  - Line 588: function 'ElementwiseOr._derive_out_dtype'
  - Line 596: class 'ElementwiseXor'
  - Line 602: function 'ElementwiseXor._derive_out_dtype'
  - Line 610: class 'ElementwiseEqual'
  - Line 616: function 'ElementwiseEqual._derive_out_dtype'
  - Line 624: class 'ElementwiseLess'
  - Line 630: function 'ElementwiseLess._derive_out_dtype'
  - Line 638: class 'ElementwiseLessOrEqual'
  - Line 644: function 'ElementwiseLessOrEqual._derive_out_dtype'
  - Line 652: class 'ElementwiseGreater'
  - Line 658: function 'ElementwiseGreater._derive_out_dtype'
  - Line 667: class 'ElementwiseGreaterOrEqual'
  - Line 673: function 'ElementwiseGreaterOrEqual._derive_out_dtype'
  - Line 681: class 'ElementwiseBitwiseAnd'
  - Line 687: function 'ElementwiseBitwiseAnd._derive_out_dtype'
  - Line 703: class 'ElementwiseBitwiseOr'
  - Line 709: function 'ElementwiseBitwiseOr._derive_out_dtype'
  - Line 725: class 'ElementwiseBitwiseXor'
  - Line 731: function 'ElementwiseBitwiseXor._derive_out_dtype'
  - Line 747: class 'ElementwiseBitShift'
  - Line 749: function 'ElementwiseBitShift.get_nodeattr_types'
  - Line 763: function 'ElementwiseBitShift.npy_op'
  - Line 768: function 'ElementwiseBitShift.cpp_op'
  - Line 773: function 'ElementwiseBitShift.rtl_op'
  - Line 777: function 'ElementwiseBitShift._derive_out_dtype'
  - Line 794: class 'ElementwiseMax'
  - Line 796: function 'ElementwiseMax.npy_op'
  - Line 801: function 'ElementwiseMax.cpp_op'
  - Line 807: function 'ElementwiseMax.rtl_op'
  - Line 810: function 'ElementwiseMax._derive_out_dtype'

📄 src/finn/custom_op/fpgadataflow/fmpadding.py:
  - Line 1: module 'fmpadding.py'
  - Line 41: function 'FMPadding.__init__'
  - Line 44: function 'FMPadding.get_nodeattr_types'
  - Line 76: function 'FMPadding.get_exp_cycles'
  - Line 84: function 'FMPadding.get_normal_input_shape'
  - Line 90: function 'FMPadding.get_normal_output_shape'
  - Line 97: function 'FMPadding.get_folded_input_shape'
  - Line 106: function 'FMPadding.get_folded_output_shape'
  - Line 115: function 'FMPadding.make_shape_compatible_op'
  - Line 122: function 'FMPadding.infer_node_datatype'
  - Line 135: function 'FMPadding.verify_node'
  - Line 150: function 'FMPadding.get_instream_width'
  - Line 155: function 'FMPadding.get_outstream_width'
  - Line 160: function 'FMPadding.get_number_output_values'
  - Line 164: function 'FMPadding.execute_node'
  - Line 175: function 'FMPadding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/hls/replicate_stream_hls.py:
  - Line 1: module 'replicate_stream_hls.py'
  - Line 15: class 'ReplicateStream_hls'
  - Line 20: function 'ReplicateStream_hls.get_nodeattr_types'
  - Line 30: function 'ReplicateStream_hls.get_ap_int_max_w'
  - Line 46: function 'ReplicateStream_hls.global_includes'
  - Line 51: function 'ReplicateStream_hls.defines'
  - Line 74: function 'ReplicateStream_hls.docompute'
  - Line 76: function 'ReplicateStream_hls.out'
  - Line 100: function 'ReplicateStream_hls.blackboxfunction'
  - Line 119: function 'ReplicateStream_hls.pragmas'
  - Line 138: function 'ReplicateStream_hls.get_verilog_top_module_intf_names'

📄 src/finn/custom_op/fpgadataflow/hwcustomop.py:
  - Line 1: module 'hwcustomop.py'
  - Line 47: function 'HWCustomOp.__init__'
  - Line 51: function 'HWCustomOp.get_nodeattr_types'
  - Line 102: function 'HWCustomOp.make_shape_compatible_op'
  - Line 313: function 'HWCustomOp.derive_token_access_vectors'
  - Line 343: function 'HWCustomOp.derive_token_access_vectors_using_tree_model'
  - Line 510: function 'HWCustomOp.generate_hdl_dynload'
  - Line 619: function 'HWCustomOp.accumulate_char_fxn'

📄 src/finn/custom_op/fpgadataflow/labelselect.py:
  - Line 1: module 'labelselect.py'
  - Line 41: function 'LabelSelect.__init__'
  - Line 55: function 'LabelSelect.get_nodeattr_types'
  - Line 72: function 'LabelSelect.get_normal_input_shape'
  - Line 78: function 'LabelSelect.get_folded_input_shape'
  - Line 87: function 'LabelSelect.get_normal_output_shape'
  - Line 93: function 'LabelSelect.get_folded_output_shape'
  - Line 99: function 'LabelSelect.make_shape_compatible_op'
  - Line 114: function 'LabelSelect.infer_node_datatype'
  - Line 123: function 'LabelSelect.verify_node'
  - Line 147: function 'LabelSelect.get_number_output_values'
  - Line 150: function 'LabelSelect.execute_node'
  - Line 180: function 'LabelSelect.get_exp_cycles'
  - Line 187: function 'LabelSelect.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/matrixvectoractivation.py:
  - Line 1: module 'matrixvectoractivation.py'
  - Line 58: function 'MVAU.__init__'
  - Line 61: function 'MVAU.get_nodeattr_types'
  - Line 134: function 'MVAU.execute_node'
  - Line 176: function 'MVAU.verify_node'
  - Line 231: function 'MVAU.infer_node_datatype'
  - Line 265: function 'MVAU.get_instream_width'
  - Line 298: function 'MVAU.get_outstream_width'
  - Line 303: function 'MVAU.get_folded_input_shape'
  - Line 329: function 'MVAU.get_folded_output_shape'
  - Line 337: function 'MVAU.get_normal_input_shape'
  - Line 349: function 'MVAU.get_normal_output_shape'
  - Line 375: function 'MVAU.uram_estimation'
  - Line 437: function 'MVAU.bram_efficiency_estimation'
  - Line 463: function 'MVAU.get_exp_cycles'
  - Line 788: function 'MVAU.generate_params'
  - Line 863: function 'MVAU.get_op_and_param_counts'
  - Line 887: function 'MVAU.get_verilog_top_module_intf_names'
  - Line 913: function 'MVAU.code_generation_ipi'
  - Line 1098: function 'MVAU.get_tree_model'
  - Line 1147: function 'MVAU.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/pool.py:
  - Line 233: function 'Pool.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/replicate_stream.py:
  - Line 1: module 'replicate_stream.py'
  - Line 27: class 'ReplicateStream'
  - Line 29: function 'ReplicateStream.__init__'
  - Line 40: function 'ReplicateStream.get_nodeattr_types'
  - Line 70: function 'ReplicateStream.num'
  - Line 75: function 'ReplicateStream.dtype'
  - Line 81: function 'ReplicateStream.num_elems'
  - Line 86: function 'ReplicateStream.pe'
  - Line 91: function 'ReplicateStream.num_inputs'
  - Line 97: function 'ReplicateStream.make_shape_compatible_op'
  - Line 113: function 'ReplicateStream.infer_node_datatype'
  - Line 132: function 'ReplicateStream._execute_node_python'
  - Line 143: function 'ReplicateStream._execute_node_cppsim'
  - Line 150: function 'ReplicateStream.execute_node'
  - Line 160: function 'ReplicateStream.verify_node'
  - Line 167: function 'ReplicateStream.get_input_datatype'
  - Line 172: function 'ReplicateStream.get_output_datatype'
  - Line 177: function 'ReplicateStream.get_normal_input_shape'
  - Line 183: function 'ReplicateStream.get_normal_output_shape'
  - Line 189: function 'ReplicateStream.get_folded_input_shape'
  - Line 196: function 'ReplicateStream.get_folded_output_shape'
  - Line 203: function 'ReplicateStream.get_instream_width'
  - Line 213: function 'ReplicateStream.get_outstream_width'
  - Line 224: function 'ReplicateStream.get_number_output_values'
  - Line 237: function 'ReplicateStream.get_exp_cycles'

📄 src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py:
  - Line 1: module 'streamingdatawidthconverter.py'
  - Line 44: function 'StreamingDataWidthConverter.get_nodeattr_types'
  - Line 68: function 'StreamingDataWidthConverter.get_normal_input_shape'
  - Line 72: function 'StreamingDataWidthConverter.get_normal_output_shape'
  - Line 76: function 'StreamingDataWidthConverter.get_iowidth_lcm'
  - Line 81: function 'StreamingDataWidthConverter.needs_lcm'
  - Line 88: function 'StreamingDataWidthConverter.check_divisible_iowidths'
  - Line 91: function 'StreamingDataWidthConverter.get_folded_input_shape'
  - Line 111: function 'StreamingDataWidthConverter.get_folded_output_shape'
  - Line 132: function 'StreamingDataWidthConverter.get_number_input_values'
  - Line 136: function 'StreamingDataWidthConverter.get_number_output_values'
  - Line 140: function 'StreamingDataWidthConverter.get_instream_width'
  - Line 144: function 'StreamingDataWidthConverter.get_outstream_width'
  - Line 148: function 'StreamingDataWidthConverter.infer_node_datatype'
  - Line 162: function 'StreamingDataWidthConverter.verify_node'
  - Line 179: function 'StreamingDataWidthConverter.execute_node'
  - Line 190: function 'StreamingDataWidthConverter.get_exp_cycles'
  - Line 222: function 'StreamingDataWidthConverter.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/thresholding.py:
  - Line 384: function 'Thresholding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/vectorvectoractivation.py:
  - Line 1067: function 'VVAU.get_tree_model'
  - Line 1122: function 'VVAU.derive_token_access_vectors'

📄 src/finn/templates/python_driver/driver.py:
  - Line 881: function 'FINNLiveFIFOOverlay.ctrl_read'
  - Line 893: function 'FINNLiveFIFOOverlay.ctrl_write'

📄 src/finn/transformation/fpgadataflow/derive_characteristic.py:
  - Line 1: module 'derive_characteristic.py'
  - Line 45: class 'JustInTimeSynthesizeParallel'
  - Line 46: function 'JustInTimeSynthesizeParallel.__init__'
  - Line 52: function 'JustInTimeSynthesizeParallel.applyNodeLocal'
  - Line 95: class 'JustInTimeSynthesize'
  - Line 96: function 'JustInTimeSynthesize.__init__'
  - Line 102: function 'JustInTimeSynthesize.apply'
  - Line 159: function 'DeriveTokenAccessVectors.__init__'
  - Line 179: function 'DeriveTokenAccessVectors.applyNodeLocal'
  - Line 209: function 'DeriveTokenAccessVectors.apply'
  - Line 227: function 'LocalStretchCharacteristicFunctions.__init__'
  - Line 232: function 'LocalStretchCharacteristicFunctions.applyNodeLocal'
  - Line 324: function 'get_top_producer_period'
  - Line 342: function 'get_top_consumer_period'
  - Line 408: function 'get_nodes_until_converging'
  - Line 419: function 'get_throughput'
  - Line 441: function 'get_parent_throughput'
  - Line 452: function 'get_parent'
  - Line 462: function 'get_consumer'
  - Line 468: function 'get_consumer_throughput'
  - Line 479: function 'get_true_period'
  - Line 486: function 'get_branch_nodes'
  - Line 494: function 'get_branch_volume'
  - Line 537: function 'calculate_peak_volume_delta'
  - Line 594: function 'compute_node_latency_init_periods'
  - Line 601: function 'max_dist'
  - Line 635: function 'get_full_branch_latency'
  - Line 642: function 'assign_extra_fifo_volume'
  - Line 751: function 'HandleBranches.__init__'
  - Line 756: function 'HandleBranches.apply'
  - Line 783: function 'ProducerDelayCharacteristicFunctions.__init__'
  - Line 788: function 'ProducerDelayCharacteristicFunctions.applyNodeLocal'
  - Line 858: function 'DelayCharacteristicFunctions.__init__'
  - Line 863: function 'DelayCharacteristicFunctions.applyNodeLocal'
  - Line 945: function 'inter_token_gaps'
  - Line 964: function 'remove_trailing_duplicates_keep_one'
  - Line 979: function 'remove_leading_duplicates_keep_one'
  - Line 1001: function 'DeriveFIFOSizes.__init__'
  - Line 1029: function 'DeriveFIFOSizes.apply'

📄 src/finn/util/basic.py:
  - Line 410: function 'get_driver_shapes'
  - Line 502: function 'stretch'
  - Line 510: class 'Characteristic_Node'
  - Line 511: function 'Characteristic_Node.__init__'
  - Line 520: function 'Characteristic_Node.sum'
  - Line 581: function 'compress_numpy_to_string'
  - Line 597: function 'decompress_string_to_numpy'
  - Line 609: function 'compute_total_model_fifo_size'

Total missing docstrings: 332

@github-actions
Copy link
Copy Markdown

📋 Docstring Check Report

Checked files:

  • ci/collect.py
  • src/finn/analysis/fpgadataflow/dataflow_performance.py
  • src/finn/builder/build_dataflow_config.py
  • src/finn/builder/build_dataflow_steps.py
  • src/finn/custom_op/fpgadataflow/addstreams.py
  • src/finn/custom_op/fpgadataflow/attention.py
  • src/finn/custom_op/fpgadataflow/channelwise_op.py
  • src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py
  • src/finn/custom_op/fpgadataflow/duplicatestreams.py
  • src/finn/custom_op/fpgadataflow/elementwise_binary.py
  • src/finn/custom_op/fpgadataflow/fmpadding.py
  • src/finn/custom_op/fpgadataflow/hls/attention_hls.py
  • src/finn/custom_op/fpgadataflow/hls/replicate_stream_hls.py
  • src/finn/custom_op/fpgadataflow/hlsbackend.py
  • src/finn/custom_op/fpgadataflow/hwcustomop.py
  • src/finn/custom_op/fpgadataflow/labelselect.py
  • src/finn/custom_op/fpgadataflow/matrixvectoractivation.py
  • src/finn/custom_op/fpgadataflow/pool.py
  • src/finn/custom_op/fpgadataflow/replicate_stream.py
  • src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py
  • src/finn/custom_op/fpgadataflow/thresholding.py
  • src/finn/custom_op/fpgadataflow/vectorvectoractivation.py
  • src/finn/templates/python_driver/driver.py
  • src/finn/transformation/fpgadataflow/derive_characteristic.py
  • src/finn/transformation/fpgadataflow/make_zynq_proj.py
  • src/finn/util/basic.py
  • tests/fpgadataflow/test_convert_to_hw_pool_batch.py
  • tests/fpgadataflow/test_fifosizing.py
  • tests/fpgadataflow/test_fpgadataflow_attention.py
  • tests/fpgadataflow/test_fpgadataflow_channelwise_ops.py
  • tests/fpgadataflow/test_fpgadataflow_convinputgenerator.py
  • tests/fpgadataflow/test_fpgadataflow_downsampler.py
  • tests/fpgadataflow/test_fpgadataflow_dwc.py
  • tests/fpgadataflow/test_fpgadataflow_fmpadding.py
  • tests/fpgadataflow/test_fpgadataflow_labelselect.py
  • tests/fpgadataflow/test_fpgadataflow_mvau.py
  • tests/fpgadataflow/test_fpgadataflow_thresholding.py
  • tests/fpgadataflow/test_fpgadataflow_vvau.py
  • tests/testing_util/test.py

Docstring check failed!

Missing Docstrings Details:

  • ci/collect.py
  • src/finn/analysis/fpgadataflow/dataflow_performance.py
  • src/finn/builder/build_dataflow_config.py
  • src/finn/builder/build_dataflow_steps.py
  • src/finn/custom_op/fpgadataflow/addstreams.py
  • src/finn/custom_op/fpgadataflow/attention.py
  • src/finn/custom_op/fpgadataflow/channelwise_op.py
  • src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py
  • src/finn/custom_op/fpgadataflow/duplicatestreams.py
  • src/finn/custom_op/fpgadataflow/elementwise_binary.py
  • src/finn/custom_op/fpgadataflow/fmpadding.py
  • src/finn/custom_op/fpgadataflow/hls/attention_hls.py
  • src/finn/custom_op/fpgadataflow/hls/replicate_stream_hls.py
  • src/finn/custom_op/fpgadataflow/hlsbackend.py
  • src/finn/custom_op/fpgadataflow/hwcustomop.py
  • src/finn/custom_op/fpgadataflow/labelselect.py
  • src/finn/custom_op/fpgadataflow/matrixvectoractivation.py
  • src/finn/custom_op/fpgadataflow/pool.py
  • src/finn/custom_op/fpgadataflow/replicate_stream.py
  • src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py
  • src/finn/custom_op/fpgadataflow/thresholding.py
  • src/finn/custom_op/fpgadataflow/vectorvectoractivation.py
  • src/finn/templates/python_driver/driver.py
  • src/finn/transformation/fpgadataflow/derive_characteristic.py
  • src/finn/transformation/fpgadataflow/make_zynq_proj.py
  • src/finn/util/basic.py

📄 src/finn/analysis/fpgadataflow/dataflow_performance.py:

    • Line 1: module 'dataflow_performance.py'

📄 src/finn/custom_op/fpgadataflow/addstreams.py:

    • Line 1: module 'addstreams.py'
    • Line 41: function 'AddStreams.init'
    • Line 44: function 'AddStreams.get_nodeattr_types'
    • Line 62: function 'AddStreams.get_normal_input_shape'
    • Line 68: function 'AddStreams.get_folded_input_shape'
    • Line 76: function 'AddStreams.get_normal_output_shape'
    • Line 79: function 'AddStreams.get_folded_output_shape'
    • Line 82: function 'AddStreams.infer_node_datatype'
    • Line 137: function 'AddStreams.get_exp_cycles'
    • Line 141: function 'AddStreams.execute_node'
    • Line 153: function 'AddStreams.prepare_tree_model'
    • Line 161: function 'AddStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/attention.py:

    • Line 1: module 'attention.py'
    • Line 31: function 'softmax'
    • Line 49: class 'ScaledDotProductAttention'
    • Line 51: function 'ScaledDotProductAttention.init'
    • Line 56: function 'ScaledDotProductAttention.get_nodeattr_types'
    • Line 172: function 'ScaledDotProductAttention.shapes'
    • Line 180: function 'ScaledDotProductAttention.folds'
    • Line 188: function 'ScaledDotProductAttention.is_valid_folding'
    • Line 200: function 'ScaledDotProductAttention.iterations'
    • Line 207: function 'ScaledDotProductAttention.make_shape_compatible_op'
    • Line 226: function 'ScaledDotProductAttention.infer_node_datatype'
    • Line 287: function 'ScaledDotProductAttention._execute_node_python'
    • Line 299: function 'ScaledDotProductAttention.act_qk_matmul'
    • Line 316: function 'ScaledDotProductAttention.act_a_softmax'
    • Line 334: function 'ScaledDotProductAttention.act_av_matmul'
    • Line 410: function 'ScaledDotProductAttention._execute_node_cppsim'
    • Line 417: function 'ScaledDotProductAttention._execute_node_rtlsim'
    • Line 424: function 'ScaledDotProductAttention.execute_node'
    • Line 434: function 'ScaledDotProductAttention.verify_node'
    • Line 438: function 'ScaledDotProductAttention.get_input_datatype'
    • Line 477: function 'ScaledDotProductAttention.get_output_datatype'
    • Line 484: function 'ScaledDotProductAttention.get_normal_input_shape'
    • Line 533: function 'ScaledDotProductAttention.get_normal_output_shape'
    • Line 541: function 'ScaledDotProductAttention.get_normal_attention_shape'
    • Line 547: function 'ScaledDotProductAttention.get_folded_input_shape'
    • Line 579: function 'ScaledDotProductAttention.get_folded_output_shape'
    • Line 590: function 'ScaledDotProductAttention.get_folded_attention_shape'
    • Line 600: function 'ScaledDotProductAttention.get_instream_width'
    • Line 619: function 'ScaledDotProductAttention.get_outstream_width'
    • Line 629: function 'ScaledDotProductAttention.minimize_accumulator_width'
    • Line 716: function 'ScaledDotProductAttention.get_number_input_values'
    • Line 723: function 'ScaledDotProductAttention.get_number_output_values'
    • Line 733: function 'ScaledDotProductAttention.get_input_name_by_name'
    • Line 772: function 'ScaledDotProductAttention.get_exp_cycles'

📄 src/finn/custom_op/fpgadataflow/channelwise_op.py:

    • Line 1: module 'channelwise_op.py'
    • Line 80: function 'ChannelwiseOp.init'
    • Line 83: function 'ChannelwiseOp.get_nodeattr_types'
    • Line 112: function 'ChannelwiseOp.infer_node_datatype'
    • Line 162: function 'ChannelwiseOp.get_instream_width'
    • Line 172: function 'ChannelwiseOp.get_outstream_width'
    • Line 176: function 'ChannelwiseOp.get_folded_input_shape'
    • Line 189: function 'ChannelwiseOp.get_folded_output_shape'
    • Line 193: function 'ChannelwiseOp.get_normal_input_shape'
    • Line 206: function 'ChannelwiseOp.get_normal_output_shape'
    • Line 210: function 'ChannelwiseOp.get_exp_cycles'
    • Line 214: function 'ChannelwiseOp.execute_node'
    • Line 245: function 'ChannelwiseOp.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py:

    • Line 1: module 'convolutioninputgenerator.py'
    • Line 50: function 'ConvolutionInputGenerator.init'
    • Line 53: function 'ConvolutionInputGenerator.get_nodeattr_types'
    • Line 88: function 'ConvolutionInputGenerator.get_normal_input_shape'
    • Line 94: function 'ConvolutionInputGenerator.get_folded_input_shape'
    • Line 103: function 'ConvolutionInputGenerator.get_normal_output_shape'
    • Line 115: function 'ConvolutionInputGenerator.get_folded_output_shape'
    • Line 134: function 'ConvolutionInputGenerator.infer_node_datatype'
    • Line 179: function 'ConvolutionInputGenerator.get_outstream_width'
    • Line 188: function 'ConvolutionInputGenerator.get_1d_conv_attrs_normalized'
    • Line 214: function 'ConvolutionInputGenerator.get_exp_cycles'
    • Line 217: function 'ConvolutionInputGenerator.bram_estimation'
    • Line 220: function 'ConvolutionInputGenerator.lut_estimation'
    • Line 223: function 'ConvolutionInputGenerator.uram_estimation'
    • Line 226: function 'ConvolutionInputGenerator.execute_node'
    • Line 265: function 'ConvolutionInputGenerator.get_tree_model_uniform_distribution_based'
    • Line 266: function 'ConvolutionInputGenerator.distribute_outputs_uniform'
    • Line 563: function 'ConvolutionInputGenerator.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/duplicatestreams.py:

    • Line 1: module 'duplicatestreams.py'
    • Line 40: function 'DuplicateStreams.init'
    • Line 43: function 'DuplicateStreams.get_nodeattr_types'
    • Line 60: function 'DuplicateStreams.get_num_output_streams'
    • Line 63: function 'DuplicateStreams.get_normal_input_shape'
    • Line 69: function 'DuplicateStreams.get_folded_input_shape'
    • Line 78: function 'DuplicateStreams.get_normal_output_shape'
    • Line 83: function 'DuplicateStreams.get_folded_output_shape'
    • Line 88: function 'DuplicateStreams.make_shape_compatible_op'
    • Line 93: function 'DuplicateStreams.infer_node_datatype'
    • Line 130: function 'DuplicateStreams.get_number_output_values'
    • Line 136: function 'DuplicateStreams.get_exp_cycles'
    • Line 140: function 'DuplicateStreams.execute_node'
    • Line 152: function 'DuplicateStreams.get_tree_model'
    • Line 162: function 'DuplicateStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/elementwise_binary.py:

    • Line 1: module 'elementwise_binary.py'
    • Line 44: class 'ElementwiseBinaryOperation'
    • Line 51: function 'ElementwiseBinaryOperation.npy_op'
    • Line 56: function 'ElementwiseBinaryOperation.cpp_op'
    • Line 61: function 'ElementwiseBinaryOperation.rtl_op'
    • Line 65: function 'ElementwiseBinaryOperation.init'
    • Line 70: function 'ElementwiseBinaryOperation.get_nodeattr_types'
    • Line 119: function 'ElementwiseBinaryOperation.lhs_dtype'
    • Line 125: function 'ElementwiseBinaryOperation.rhs_dtype'
    • Line 131: function 'ElementwiseBinaryOperation.out_dtype'
    • Line 137: function 'ElementwiseBinaryOperation.lhs_shape'
    • Line 142: function 'ElementwiseBinaryOperation.rhs_shape'
    • Line 147: function 'ElementwiseBinaryOperation.out_shape'
    • Line 152: function 'ElementwiseBinaryOperation.lhs_style'
    • Line 157: function 'ElementwiseBinaryOperation.rhs_style'
    • Line 162: function 'ElementwiseBinaryOperation.pe'
    • Line 167: function 'ElementwiseBinaryOperation.broadcast_last_axis'
    • Line 173: function 'ElementwiseBinaryOperation.make_shape_compatible_op'
    • Line 193: function 'ElementwiseBinaryOperation.infer_node_datatype'
    • Line 215: function 'ElementwiseBinaryOperation.execute_node'
    • Line 240: function 'ElementwiseBinaryOperation.get_input_datatype'
    • Line 245: function 'ElementwiseBinaryOperation.get_output_datatype'
    • Line 250: function 'ElementwiseBinaryOperation.get_normal_input_shape'
    • Line 255: function 'ElementwiseBinaryOperation.get_normal_output_shape'
    • Line 260: function 'ElementwiseBinaryOperation.get_folded_input_shape'
    • Line 274: function 'ElementwiseBinaryOperation.get_folded_output_shape'
    • Line 288: function 'ElementwiseBinaryOperation.get_instream_width'
    • Line 310: function 'ElementwiseBinaryOperation.get_outstream_width'
    • Line 321: function 'ElementwiseBinaryOperation.minimize_accumulator_width'
    • Line 344: function 'ElementwiseBinaryOperation._derive_out_dtype'
    • Line 353: function 'ElementwiseBinaryOperation.minimize_weight_bit_width'
    • Line 437: function 'ElementwiseBinaryOperation.get_exp_cycles'
    • Line 445: class 'ElementwiseAdd'
    • Line 451: function 'ElementwiseAdd._derive_out_dtype'
    • Line 485: class 'ElementwiseSub'
    • Line 491: function 'ElementwiseSub._derive_out_dtype'
    • Line 521: class 'ElementwiseMul'
    • Line 527: function 'ElementwiseMul._derive_out_dtype'
    • Line 542: class 'ElementwiseDiv'
    • Line 549: function 'ElementwiseDiv._derive_out_dtype'
    • Line 568: class 'ElementwiseAnd'
    • Line 574: function 'ElementwiseAnd._derive_out_dtype'
    • Line 582: class 'ElementwiseOr'
    • Line 588: function 'ElementwiseOr._derive_out_dtype'
    • Line 596: class 'ElementwiseXor'
    • Line 602: function 'ElementwiseXor._derive_out_dtype'
    • Line 610: class 'ElementwiseEqual'
    • Line 616: function 'ElementwiseEqual._derive_out_dtype'
    • Line 624: class 'ElementwiseLess'
    • Line 630: function 'ElementwiseLess._derive_out_dtype'
    • Line 638: class 'ElementwiseLessOrEqual'
    • Line 644: function 'ElementwiseLessOrEqual._derive_out_dtype'
    • Line 652: class 'ElementwiseGreater'
    • Line 658: function 'ElementwiseGreater._derive_out_dtype'
    • Line 667: class 'ElementwiseGreaterOrEqual'
    • Line 673: function 'ElementwiseGreaterOrEqual._derive_out_dtype'
    • Line 681: class 'ElementwiseBitwiseAnd'
    • Line 687: function 'ElementwiseBitwiseAnd._derive_out_dtype'
    • Line 703: class 'ElementwiseBitwiseOr'
    • Line 709: function 'ElementwiseBitwiseOr._derive_out_dtype'
    • Line 725: class 'ElementwiseBitwiseXor'
    • Line 731: function 'ElementwiseBitwiseXor._derive_out_dtype'
    • Line 747: class 'ElementwiseBitShift'
    • Line 749: function 'ElementwiseBitShift.get_nodeattr_types'
    • Line 763: function 'ElementwiseBitShift.npy_op'
    • Line 768: function 'ElementwiseBitShift.cpp_op'
    • Line 773: function 'ElementwiseBitShift.rtl_op'
    • Line 777: function 'ElementwiseBitShift._derive_out_dtype'
    • Line 794: class 'ElementwiseMax'
    • Line 796: function 'ElementwiseMax.npy_op'
    • Line 801: function 'ElementwiseMax.cpp_op'
    • Line 807: function 'ElementwiseMax.rtl_op'
    • Line 810: function 'ElementwiseMax._derive_out_dtype'

📄 src/finn/custom_op/fpgadataflow/fmpadding.py:

    • Line 1: module 'fmpadding.py'
    • Line 41: function 'FMPadding.init'
    • Line 44: function 'FMPadding.get_nodeattr_types'
    • Line 76: function 'FMPadding.get_exp_cycles'
    • Line 84: function 'FMPadding.get_normal_input_shape'
    • Line 90: function 'FMPadding.get_normal_output_shape'
    • Line 97: function 'FMPadding.get_folded_input_shape'
    • Line 106: function 'FMPadding.get_folded_output_shape'
    • Line 115: function 'FMPadding.make_shape_compatible_op'
    • Line 122: function 'FMPadding.infer_node_datatype'
    • Line 135: function 'FMPadding.verify_node'
    • Line 150: function 'FMPadding.get_instream_width'
    • Line 155: function 'FMPadding.get_outstream_width'
    • Line 160: function 'FMPadding.get_number_output_values'
    • Line 164: function 'FMPadding.execute_node'
    • Line 175: function 'FMPadding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/hls/replicate_stream_hls.py:

    • Line 1: module 'replicate_stream_hls.py'
    • Line 15: class 'ReplicateStream_hls'
    • Line 20: function 'ReplicateStream_hls.get_nodeattr_types'
    • Line 30: function 'ReplicateStream_hls.get_ap_int_max_w'
    • Line 46: function 'ReplicateStream_hls.global_includes'
    • Line 51: function 'ReplicateStream_hls.defines'
    • Line 74: function 'ReplicateStream_hls.docompute'
    • Line 76: function 'ReplicateStream_hls.out'
    • Line 100: function 'ReplicateStream_hls.blackboxfunction'
    • Line 119: function 'ReplicateStream_hls.pragmas'
    • Line 138: function 'ReplicateStream_hls.get_verilog_top_module_intf_names'

📄 src/finn/custom_op/fpgadataflow/hwcustomop.py:

    • Line 1: module 'hwcustomop.py'
    • Line 47: function 'HWCustomOp.init'
    • Line 51: function 'HWCustomOp.get_nodeattr_types'
    • Line 102: function 'HWCustomOp.make_shape_compatible_op'
    • Line 313: function 'HWCustomOp.derive_token_access_vectors'
    • Line 343: function 'HWCustomOp.derive_token_access_vectors_using_tree_model'
    • Line 510: function 'HWCustomOp.generate_hdl_dynload'
    • Line 619: function 'HWCustomOp.accumulate_char_fxn'

📄 src/finn/custom_op/fpgadataflow/labelselect.py:

    • Line 1: module 'labelselect.py'
    • Line 41: function 'LabelSelect.init'
    • Line 55: function 'LabelSelect.get_nodeattr_types'
    • Line 72: function 'LabelSelect.get_normal_input_shape'
    • Line 78: function 'LabelSelect.get_folded_input_shape'
    • Line 87: function 'LabelSelect.get_normal_output_shape'
    • Line 93: function 'LabelSelect.get_folded_output_shape'
    • Line 99: function 'LabelSelect.make_shape_compatible_op'
    • Line 114: function 'LabelSelect.infer_node_datatype'
    • Line 123: function 'LabelSelect.verify_node'
    • Line 147: function 'LabelSelect.get_number_output_values'
    • Line 150: function 'LabelSelect.execute_node'
    • Line 180: function 'LabelSelect.get_exp_cycles'
    • Line 187: function 'LabelSelect.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/matrixvectoractivation.py:

    • Line 1: module 'matrixvectoractivation.py'
    • Line 58: function 'MVAU.init'
    • Line 61: function 'MVAU.get_nodeattr_types'
    • Line 134: function 'MVAU.execute_node'
    • Line 176: function 'MVAU.verify_node'
    • Line 231: function 'MVAU.infer_node_datatype'
    • Line 265: function 'MVAU.get_instream_width'
    • Line 298: function 'MVAU.get_outstream_width'
    • Line 303: function 'MVAU.get_folded_input_shape'
    • Line 329: function 'MVAU.get_folded_output_shape'
    • Line 337: function 'MVAU.get_normal_input_shape'
    • Line 349: function 'MVAU.get_normal_output_shape'
    • Line 375: function 'MVAU.uram_estimation'
    • Line 437: function 'MVAU.bram_efficiency_estimation'
    • Line 463: function 'MVAU.get_exp_cycles'
    • Line 788: function 'MVAU.generate_params'
    • Line 863: function 'MVAU.get_op_and_param_counts'
    • Line 887: function 'MVAU.get_verilog_top_module_intf_names'
    • Line 913: function 'MVAU.code_generation_ipi'
    • Line 1098: function 'MVAU.get_tree_model'
    • Line 1147: function 'MVAU.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/pool.py:

    • Line 233: function 'Pool.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/replicate_stream.py:

    • Line 1: module 'replicate_stream.py'
    • Line 27: class 'ReplicateStream'
    • Line 29: function 'ReplicateStream.init'
    • Line 40: function 'ReplicateStream.get_nodeattr_types'
    • Line 70: function 'ReplicateStream.num'
    • Line 75: function 'ReplicateStream.dtype'
    • Line 81: function 'ReplicateStream.num_elems'
    • Line 86: function 'ReplicateStream.pe'
    • Line 91: function 'ReplicateStream.num_inputs'
    • Line 97: function 'ReplicateStream.make_shape_compatible_op'
    • Line 113: function 'ReplicateStream.infer_node_datatype'
    • Line 132: function 'ReplicateStream._execute_node_python'
    • Line 143: function 'ReplicateStream._execute_node_cppsim'
    • Line 150: function 'ReplicateStream.execute_node'
    • Line 160: function 'ReplicateStream.verify_node'
    • Line 167: function 'ReplicateStream.get_input_datatype'
    • Line 172: function 'ReplicateStream.get_output_datatype'
    • Line 177: function 'ReplicateStream.get_normal_input_shape'
    • Line 183: function 'ReplicateStream.get_normal_output_shape'
    • Line 189: function 'ReplicateStream.get_folded_input_shape'
    • Line 196: function 'ReplicateStream.get_folded_output_shape'
    • Line 203: function 'ReplicateStream.get_instream_width'
    • Line 213: function 'ReplicateStream.get_outstream_width'
    • Line 224: function 'ReplicateStream.get_number_output_values'
    • Line 237: function 'ReplicateStream.get_exp_cycles'

📄 src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py:

    • Line 1: module 'streamingdatawidthconverter.py'
    • Line 44: function 'StreamingDataWidthConverter.get_nodeattr_types'
    • Line 68: function 'StreamingDataWidthConverter.get_normal_input_shape'
    • Line 72: function 'StreamingDataWidthConverter.get_normal_output_shape'
    • Line 76: function 'StreamingDataWidthConverter.get_iowidth_lcm'
    • Line 81: function 'StreamingDataWidthConverter.needs_lcm'
    • Line 88: function 'StreamingDataWidthConverter.check_divisible_iowidths'
    • Line 91: function 'StreamingDataWidthConverter.get_folded_input_shape'
    • Line 111: function 'StreamingDataWidthConverter.get_folded_output_shape'
    • Line 132: function 'StreamingDataWidthConverter.get_number_input_values'
    • Line 136: function 'StreamingDataWidthConverter.get_number_output_values'
    • Line 140: function 'StreamingDataWidthConverter.get_instream_width'
    • Line 144: function 'StreamingDataWidthConverter.get_outstream_width'
    • Line 148: function 'StreamingDataWidthConverter.infer_node_datatype'
    • Line 162: function 'StreamingDataWidthConverter.verify_node'
    • Line 179: function 'StreamingDataWidthConverter.execute_node'
    • Line 190: function 'StreamingDataWidthConverter.get_exp_cycles'
    • Line 222: function 'StreamingDataWidthConverter.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/thresholding.py:

    • Line 384: function 'Thresholding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/vectorvectoractivation.py:

    • Line 1067: function 'VVAU.get_tree_model'
    • Line 1122: function 'VVAU.derive_token_access_vectors'

📄 src/finn/templates/python_driver/driver.py:

    • Line 881: function 'FINNLiveFIFOOverlay.ctrl_read'
    • Line 893: function 'FINNLiveFIFOOverlay.ctrl_write'

📄 src/finn/transformation/fpgadataflow/derive_characteristic.py:

    • Line 1: module 'derive_characteristic.py'
    • Line 45: class 'JustInTimeSynthesizeParallel'
    • Line 46: function 'JustInTimeSynthesizeParallel.init'
    • Line 52: function 'JustInTimeSynthesizeParallel.applyNodeLocal'
    • Line 95: class 'JustInTimeSynthesize'
    • Line 96: function 'JustInTimeSynthesize.init'
    • Line 102: function 'JustInTimeSynthesize.apply'
    • Line 159: function 'DeriveTokenAccessVectors.init'
    • Line 179: function 'DeriveTokenAccessVectors.applyNodeLocal'
    • Line 209: function 'DeriveTokenAccessVectors.apply'
    • Line 227: function 'LocalStretchCharacteristicFunctions.init'
    • Line 232: function 'LocalStretchCharacteristicFunctions.applyNodeLocal'
    • Line 324: function 'get_top_producer_period'
    • Line 342: function 'get_top_consumer_period'
    • Line 408: function 'get_nodes_until_converging'
    • Line 419: function 'get_throughput'
    • Line 441: function 'get_parent_throughput'
    • Line 452: function 'get_parent'
    • Line 462: function 'get_consumer'
    • Line 468: function 'get_consumer_throughput'
    • Line 479: function 'get_true_period'
    • Line 486: function 'get_branch_nodes'
    • Line 494: function 'get_branch_volume'
    • Line 537: function 'calculate_peak_volume_delta'
    • Line 594: function 'compute_node_latency_init_periods'
    • Line 601: function 'max_dist'
    • Line 635: function 'get_full_branch_latency'
    • Line 642: function 'assign_extra_fifo_volume'
    • Line 751: function 'HandleBranches.init'
    • Line 756: function 'HandleBranches.apply'
    • Line 783: function 'ProducerDelayCharacteristicFunctions.init'
    • Line 788: function 'ProducerDelayCharacteristicFunctions.applyNodeLocal'
    • Line 858: function 'DelayCharacteristicFunctions.init'
    • Line 863: function 'DelayCharacteristicFunctions.applyNodeLocal'
    • Line 945: function 'inter_token_gaps'
    • Line 964: function 'remove_trailing_duplicates_keep_one'
    • Line 979: function 'remove_leading_duplicates_keep_one'
    • Line 1001: function 'DeriveFIFOSizes.init'
    • Line 1029: function 'DeriveFIFOSizes.apply'

📄 src/finn/util/basic.py:

    • Line 410: function 'get_driver_shapes'
    • Line 502: function 'stretch'
    • Line 510: class 'Characteristic_Node'
    • Line 511: function 'Characteristic_Node.init'
    • Line 520: function 'Characteristic_Node.sum'
    • Line 581: function 'compress_numpy_to_string'
    • Line 597: function 'decompress_string_to_numpy'
    • Line 609: function 'compute_total_model_fifo_size'

Total missing docstrings: 332

How to Fix:

Please add docstrings to the missing functions, classes, and modules listed above.

Docstring Guidelines:

  • All modules should have a module-level docstring
  • All public functions and methods should have docstrings
  • All private functions should have docstrings
  • All classes should have docstrings
  • Use triple quotes (""") for docstrings
  • Follow PEP 257 conventions
Raw output from docstring checker
Checking 26 specified Python file(s) (excluding tests folder):
  - ci/collect.py
  - src/finn/analysis/fpgadataflow/dataflow_performance.py
  - src/finn/builder/build_dataflow_config.py
  - src/finn/builder/build_dataflow_steps.py
  - src/finn/custom_op/fpgadataflow/addstreams.py
  - src/finn/custom_op/fpgadataflow/attention.py
  - src/finn/custom_op/fpgadataflow/channelwise_op.py
  - src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py
  - src/finn/custom_op/fpgadataflow/duplicatestreams.py
  - src/finn/custom_op/fpgadataflow/elementwise_binary.py
  - src/finn/custom_op/fpgadataflow/fmpadding.py
  - src/finn/custom_op/fpgadataflow/hls/attention_hls.py
  - src/finn/custom_op/fpgadataflow/hls/replicate_stream_hls.py
  - src/finn/custom_op/fpgadataflow/hlsbackend.py
  - src/finn/custom_op/fpgadataflow/hwcustomop.py
  - src/finn/custom_op/fpgadataflow/labelselect.py
  - src/finn/custom_op/fpgadataflow/matrixvectoractivation.py
  - src/finn/custom_op/fpgadataflow/pool.py
  - src/finn/custom_op/fpgadataflow/replicate_stream.py
  - src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py
  - src/finn/custom_op/fpgadataflow/thresholding.py
  - src/finn/custom_op/fpgadataflow/vectorvectoractivation.py
  - src/finn/templates/python_driver/driver.py
  - src/finn/transformation/fpgadataflow/derive_characteristic.py
  - src/finn/transformation/fpgadataflow/make_zynq_proj.py
  - src/finn/util/basic.py

❌ Missing docstrings found:

📄 src/finn/analysis/fpgadataflow/dataflow_performance.py:
  - Line 1: module 'dataflow_performance.py'

📄 src/finn/custom_op/fpgadataflow/addstreams.py:
  - Line 1: module 'addstreams.py'
  - Line 41: function 'AddStreams.__init__'
  - Line 44: function 'AddStreams.get_nodeattr_types'
  - Line 62: function 'AddStreams.get_normal_input_shape'
  - Line 68: function 'AddStreams.get_folded_input_shape'
  - Line 76: function 'AddStreams.get_normal_output_shape'
  - Line 79: function 'AddStreams.get_folded_output_shape'
  - Line 82: function 'AddStreams.infer_node_datatype'
  - Line 137: function 'AddStreams.get_exp_cycles'
  - Line 141: function 'AddStreams.execute_node'
  - Line 153: function 'AddStreams.prepare_tree_model'
  - Line 161: function 'AddStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/attention.py:
  - Line 1: module 'attention.py'
  - Line 31: function 'softmax'
  - Line 49: class 'ScaledDotProductAttention'
  - Line 51: function 'ScaledDotProductAttention.__init__'
  - Line 56: function 'ScaledDotProductAttention.get_nodeattr_types'
  - Line 172: function 'ScaledDotProductAttention.shapes'
  - Line 180: function 'ScaledDotProductAttention.folds'
  - Line 188: function 'ScaledDotProductAttention.is_valid_folding'
  - Line 200: function 'ScaledDotProductAttention.iterations'
  - Line 207: function 'ScaledDotProductAttention.make_shape_compatible_op'
  - Line 226: function 'ScaledDotProductAttention.infer_node_datatype'
  - Line 287: function 'ScaledDotProductAttention._execute_node_python'
  - Line 299: function 'ScaledDotProductAttention.act_qk_matmul'
  - Line 316: function 'ScaledDotProductAttention.act_a_softmax'
  - Line 334: function 'ScaledDotProductAttention.act_av_matmul'
  - Line 410: function 'ScaledDotProductAttention._execute_node_cppsim'
  - Line 417: function 'ScaledDotProductAttention._execute_node_rtlsim'
  - Line 424: function 'ScaledDotProductAttention.execute_node'
  - Line 434: function 'ScaledDotProductAttention.verify_node'
  - Line 438: function 'ScaledDotProductAttention.get_input_datatype'
  - Line 477: function 'ScaledDotProductAttention.get_output_datatype'
  - Line 484: function 'ScaledDotProductAttention.get_normal_input_shape'
  - Line 533: function 'ScaledDotProductAttention.get_normal_output_shape'
  - Line 541: function 'ScaledDotProductAttention.get_normal_attention_shape'
  - Line 547: function 'ScaledDotProductAttention.get_folded_input_shape'
  - Line 579: function 'ScaledDotProductAttention.get_folded_output_shape'
  - Line 590: function 'ScaledDotProductAttention.get_folded_attention_shape'
  - Line 600: function 'ScaledDotProductAttention.get_instream_width'
  - Line 619: function 'ScaledDotProductAttention.get_outstream_width'
  - Line 629: function 'ScaledDotProductAttention.minimize_accumulator_width'
  - Line 716: function 'ScaledDotProductAttention.get_number_input_values'
  - Line 723: function 'ScaledDotProductAttention.get_number_output_values'
  - Line 733: function 'ScaledDotProductAttention.get_input_name_by_name'
  - Line 772: function 'ScaledDotProductAttention.get_exp_cycles'

📄 src/finn/custom_op/fpgadataflow/channelwise_op.py:
  - Line 1: module 'channelwise_op.py'
  - Line 80: function 'ChannelwiseOp.__init__'
  - Line 83: function 'ChannelwiseOp.get_nodeattr_types'
  - Line 112: function 'ChannelwiseOp.infer_node_datatype'
  - Line 162: function 'ChannelwiseOp.get_instream_width'
  - Line 172: function 'ChannelwiseOp.get_outstream_width'
  - Line 176: function 'ChannelwiseOp.get_folded_input_shape'
  - Line 189: function 'ChannelwiseOp.get_folded_output_shape'
  - Line 193: function 'ChannelwiseOp.get_normal_input_shape'
  - Line 206: function 'ChannelwiseOp.get_normal_output_shape'
  - Line 210: function 'ChannelwiseOp.get_exp_cycles'
  - Line 214: function 'ChannelwiseOp.execute_node'
  - Line 245: function 'ChannelwiseOp.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py:
  - Line 1: module 'convolutioninputgenerator.py'
  - Line 50: function 'ConvolutionInputGenerator.__init__'
  - Line 53: function 'ConvolutionInputGenerator.get_nodeattr_types'
  - Line 88: function 'ConvolutionInputGenerator.get_normal_input_shape'
  - Line 94: function 'ConvolutionInputGenerator.get_folded_input_shape'
  - Line 103: function 'ConvolutionInputGenerator.get_normal_output_shape'
  - Line 115: function 'ConvolutionInputGenerator.get_folded_output_shape'
  - Line 134: function 'ConvolutionInputGenerator.infer_node_datatype'
  - Line 179: function 'ConvolutionInputGenerator.get_outstream_width'
  - Line 188: function 'ConvolutionInputGenerator.get_1d_conv_attrs_normalized'
  - Line 214: function 'ConvolutionInputGenerator.get_exp_cycles'
  - Line 217: function 'ConvolutionInputGenerator.bram_estimation'
  - Line 220: function 'ConvolutionInputGenerator.lut_estimation'
  - Line 223: function 'ConvolutionInputGenerator.uram_estimation'
  - Line 226: function 'ConvolutionInputGenerator.execute_node'
  - Line 265: function 'ConvolutionInputGenerator.get_tree_model_uniform_distribution_based'
  - Line 266: function 'ConvolutionInputGenerator.distribute_outputs_uniform'
  - Line 563: function 'ConvolutionInputGenerator.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/duplicatestreams.py:
  - Line 1: module 'duplicatestreams.py'
  - Line 40: function 'DuplicateStreams.__init__'
  - Line 43: function 'DuplicateStreams.get_nodeattr_types'
  - Line 60: function 'DuplicateStreams.get_num_output_streams'
  - Line 63: function 'DuplicateStreams.get_normal_input_shape'
  - Line 69: function 'DuplicateStreams.get_folded_input_shape'
  - Line 78: function 'DuplicateStreams.get_normal_output_shape'
  - Line 83: function 'DuplicateStreams.get_folded_output_shape'
  - Line 88: function 'DuplicateStreams.make_shape_compatible_op'
  - Line 93: function 'DuplicateStreams.infer_node_datatype'
  - Line 130: function 'DuplicateStreams.get_number_output_values'
  - Line 136: function 'DuplicateStreams.get_exp_cycles'
  - Line 140: function 'DuplicateStreams.execute_node'
  - Line 152: function 'DuplicateStreams.get_tree_model'
  - Line 162: function 'DuplicateStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/elementwise_binary.py:
  - Line 1: module 'elementwise_binary.py'
  - Line 44: class 'ElementwiseBinaryOperation'
  - Line 51: function 'ElementwiseBinaryOperation.npy_op'
  - Line 56: function 'ElementwiseBinaryOperation.cpp_op'
  - Line 61: function 'ElementwiseBinaryOperation.rtl_op'
  - Line 65: function 'ElementwiseBinaryOperation.__init__'
  - Line 70: function 'ElementwiseBinaryOperation.get_nodeattr_types'
  - Line 119: function 'ElementwiseBinaryOperation.lhs_dtype'
  - Line 125: function 'ElementwiseBinaryOperation.rhs_dtype'
  - Line 131: function 'ElementwiseBinaryOperation.out_dtype'
  - Line 137: function 'ElementwiseBinaryOperation.lhs_shape'
  - Line 142: function 'ElementwiseBinaryOperation.rhs_shape'
  - Line 147: function 'ElementwiseBinaryOperation.out_shape'
  - Line 152: function 'ElementwiseBinaryOperation.lhs_style'
  - Line 157: function 'ElementwiseBinaryOperation.rhs_style'
  - Line 162: function 'ElementwiseBinaryOperation.pe'
  - Line 167: function 'ElementwiseBinaryOperation.broadcast_last_axis'
  - Line 173: function 'ElementwiseBinaryOperation.make_shape_compatible_op'
  - Line 193: function 'ElementwiseBinaryOperation.infer_node_datatype'
  - Line 215: function 'ElementwiseBinaryOperation.execute_node'
  - Line 240: function 'ElementwiseBinaryOperation.get_input_datatype'
  - Line 245: function 'ElementwiseBinaryOperation.get_output_datatype'
  - Line 250: function 'ElementwiseBinaryOperation.get_normal_input_shape'
  - Line 255: function 'ElementwiseBinaryOperation.get_normal_output_shape'
  - Line 260: function 'ElementwiseBinaryOperation.get_folded_input_shape'
  - Line 274: function 'ElementwiseBinaryOperation.get_folded_output_shape'
  - Line 288: function 'ElementwiseBinaryOperation.get_instream_width'
  - Line 310: function 'ElementwiseBinaryOperation.get_outstream_width'
  - Line 321: function 'ElementwiseBinaryOperation.minimize_accumulator_width'
  - Line 344: function 'ElementwiseBinaryOperation._derive_out_dtype'
  - Line 353: function 'ElementwiseBinaryOperation.minimize_weight_bit_width'
  - Line 437: function 'ElementwiseBinaryOperation.get_exp_cycles'
  - Line 445: class 'ElementwiseAdd'
  - Line 451: function 'ElementwiseAdd._derive_out_dtype'
  - Line 485: class 'ElementwiseSub'
  - Line 491: function 'ElementwiseSub._derive_out_dtype'
  - Line 521: class 'ElementwiseMul'
  - Line 527: function 'ElementwiseMul._derive_out_dtype'
  - Line 542: class 'ElementwiseDiv'
  - Line 549: function 'ElementwiseDiv._derive_out_dtype'
  - Line 568: class 'ElementwiseAnd'
  - Line 574: function 'ElementwiseAnd._derive_out_dtype'
  - Line 582: class 'ElementwiseOr'
  - Line 588: function 'ElementwiseOr._derive_out_dtype'
  - Line 596: class 'ElementwiseXor'
  - Line 602: function 'ElementwiseXor._derive_out_dtype'
  - Line 610: class 'ElementwiseEqual'
  - Line 616: function 'ElementwiseEqual._derive_out_dtype'
  - Line 624: class 'ElementwiseLess'
  - Line 630: function 'ElementwiseLess._derive_out_dtype'
  - Line 638: class 'ElementwiseLessOrEqual'
  - Line 644: function 'ElementwiseLessOrEqual._derive_out_dtype'
  - Line 652: class 'ElementwiseGreater'
  - Line 658: function 'ElementwiseGreater._derive_out_dtype'
  - Line 667: class 'ElementwiseGreaterOrEqual'
  - Line 673: function 'ElementwiseGreaterOrEqual._derive_out_dtype'
  - Line 681: class 'ElementwiseBitwiseAnd'
  - Line 687: function 'ElementwiseBitwiseAnd._derive_out_dtype'
  - Line 703: class 'ElementwiseBitwiseOr'
  - Line 709: function 'ElementwiseBitwiseOr._derive_out_dtype'
  - Line 725: class 'ElementwiseBitwiseXor'
  - Line 731: function 'ElementwiseBitwiseXor._derive_out_dtype'
  - Line 747: class 'ElementwiseBitShift'
  - Line 749: function 'ElementwiseBitShift.get_nodeattr_types'
  - Line 763: function 'ElementwiseBitShift.npy_op'
  - Line 768: function 'ElementwiseBitShift.cpp_op'
  - Line 773: function 'ElementwiseBitShift.rtl_op'
  - Line 777: function 'ElementwiseBitShift._derive_out_dtype'
  - Line 794: class 'ElementwiseMax'
  - Line 796: function 'ElementwiseMax.npy_op'
  - Line 801: function 'ElementwiseMax.cpp_op'
  - Line 807: function 'ElementwiseMax.rtl_op'
  - Line 810: function 'ElementwiseMax._derive_out_dtype'

📄 src/finn/custom_op/fpgadataflow/fmpadding.py:
  - Line 1: module 'fmpadding.py'
  - Line 41: function 'FMPadding.__init__'
  - Line 44: function 'FMPadding.get_nodeattr_types'
  - Line 76: function 'FMPadding.get_exp_cycles'
  - Line 84: function 'FMPadding.get_normal_input_shape'
  - Line 90: function 'FMPadding.get_normal_output_shape'
  - Line 97: function 'FMPadding.get_folded_input_shape'
  - Line 106: function 'FMPadding.get_folded_output_shape'
  - Line 115: function 'FMPadding.make_shape_compatible_op'
  - Line 122: function 'FMPadding.infer_node_datatype'
  - Line 135: function 'FMPadding.verify_node'
  - Line 150: function 'FMPadding.get_instream_width'
  - Line 155: function 'FMPadding.get_outstream_width'
  - Line 160: function 'FMPadding.get_number_output_values'
  - Line 164: function 'FMPadding.execute_node'
  - Line 175: function 'FMPadding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/hls/replicate_stream_hls.py:
  - Line 1: module 'replicate_stream_hls.py'
  - Line 15: class 'ReplicateStream_hls'
  - Line 20: function 'ReplicateStream_hls.get_nodeattr_types'
  - Line 30: function 'ReplicateStream_hls.get_ap_int_max_w'
  - Line 46: function 'ReplicateStream_hls.global_includes'
  - Line 51: function 'ReplicateStream_hls.defines'
  - Line 74: function 'ReplicateStream_hls.docompute'
  - Line 76: function 'ReplicateStream_hls.out'
  - Line 100: function 'ReplicateStream_hls.blackboxfunction'
  - Line 119: function 'ReplicateStream_hls.pragmas'
  - Line 138: function 'ReplicateStream_hls.get_verilog_top_module_intf_names'

📄 src/finn/custom_op/fpgadataflow/hwcustomop.py:
  - Line 1: module 'hwcustomop.py'
  - Line 47: function 'HWCustomOp.__init__'
  - Line 51: function 'HWCustomOp.get_nodeattr_types'
  - Line 102: function 'HWCustomOp.make_shape_compatible_op'
  - Line 313: function 'HWCustomOp.derive_token_access_vectors'
  - Line 343: function 'HWCustomOp.derive_token_access_vectors_using_tree_model'
  - Line 510: function 'HWCustomOp.generate_hdl_dynload'
  - Line 619: function 'HWCustomOp.accumulate_char_fxn'

📄 src/finn/custom_op/fpgadataflow/labelselect.py:
  - Line 1: module 'labelselect.py'
  - Line 41: function 'LabelSelect.__init__'
  - Line 55: function 'LabelSelect.get_nodeattr_types'
  - Line 72: function 'LabelSelect.get_normal_input_shape'
  - Line 78: function 'LabelSelect.get_folded_input_shape'
  - Line 87: function 'LabelSelect.get_normal_output_shape'
  - Line 93: function 'LabelSelect.get_folded_output_shape'
  - Line 99: function 'LabelSelect.make_shape_compatible_op'
  - Line 114: function 'LabelSelect.infer_node_datatype'
  - Line 123: function 'LabelSelect.verify_node'
  - Line 147: function 'LabelSelect.get_number_output_values'
  - Line 150: function 'LabelSelect.execute_node'
  - Line 180: function 'LabelSelect.get_exp_cycles'
  - Line 187: function 'LabelSelect.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/matrixvectoractivation.py:
  - Line 1: module 'matrixvectoractivation.py'
  - Line 58: function 'MVAU.__init__'
  - Line 61: function 'MVAU.get_nodeattr_types'
  - Line 134: function 'MVAU.execute_node'
  - Line 176: function 'MVAU.verify_node'
  - Line 231: function 'MVAU.infer_node_datatype'
  - Line 265: function 'MVAU.get_instream_width'
  - Line 298: function 'MVAU.get_outstream_width'
  - Line 303: function 'MVAU.get_folded_input_shape'
  - Line 329: function 'MVAU.get_folded_output_shape'
  - Line 337: function 'MVAU.get_normal_input_shape'
  - Line 349: function 'MVAU.get_normal_output_shape'
  - Line 375: function 'MVAU.uram_estimation'
  - Line 437: function 'MVAU.bram_efficiency_estimation'
  - Line 463: function 'MVAU.get_exp_cycles'
  - Line 788: function 'MVAU.generate_params'
  - Line 863: function 'MVAU.get_op_and_param_counts'
  - Line 887: function 'MVAU.get_verilog_top_module_intf_names'
  - Line 913: function 'MVAU.code_generation_ipi'
  - Line 1098: function 'MVAU.get_tree_model'
  - Line 1147: function 'MVAU.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/pool.py:
  - Line 233: function 'Pool.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/replicate_stream.py:
  - Line 1: module 'replicate_stream.py'
  - Line 27: class 'ReplicateStream'
  - Line 29: function 'ReplicateStream.__init__'
  - Line 40: function 'ReplicateStream.get_nodeattr_types'
  - Line 70: function 'ReplicateStream.num'
  - Line 75: function 'ReplicateStream.dtype'
  - Line 81: function 'ReplicateStream.num_elems'
  - Line 86: function 'ReplicateStream.pe'
  - Line 91: function 'ReplicateStream.num_inputs'
  - Line 97: function 'ReplicateStream.make_shape_compatible_op'
  - Line 113: function 'ReplicateStream.infer_node_datatype'
  - Line 132: function 'ReplicateStream._execute_node_python'
  - Line 143: function 'ReplicateStream._execute_node_cppsim'
  - Line 150: function 'ReplicateStream.execute_node'
  - Line 160: function 'ReplicateStream.verify_node'
  - Line 167: function 'ReplicateStream.get_input_datatype'
  - Line 172: function 'ReplicateStream.get_output_datatype'
  - Line 177: function 'ReplicateStream.get_normal_input_shape'
  - Line 183: function 'ReplicateStream.get_normal_output_shape'
  - Line 189: function 'ReplicateStream.get_folded_input_shape'
  - Line 196: function 'ReplicateStream.get_folded_output_shape'
  - Line 203: function 'ReplicateStream.get_instream_width'
  - Line 213: function 'ReplicateStream.get_outstream_width'
  - Line 224: function 'ReplicateStream.get_number_output_values'
  - Line 237: function 'ReplicateStream.get_exp_cycles'

📄 src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py:
  - Line 1: module 'streamingdatawidthconverter.py'
  - Line 44: function 'StreamingDataWidthConverter.get_nodeattr_types'
  - Line 68: function 'StreamingDataWidthConverter.get_normal_input_shape'
  - Line 72: function 'StreamingDataWidthConverter.get_normal_output_shape'
  - Line 76: function 'StreamingDataWidthConverter.get_iowidth_lcm'
  - Line 81: function 'StreamingDataWidthConverter.needs_lcm'
  - Line 88: function 'StreamingDataWidthConverter.check_divisible_iowidths'
  - Line 91: function 'StreamingDataWidthConverter.get_folded_input_shape'
  - Line 111: function 'StreamingDataWidthConverter.get_folded_output_shape'
  - Line 132: function 'StreamingDataWidthConverter.get_number_input_values'
  - Line 136: function 'StreamingDataWidthConverter.get_number_output_values'
  - Line 140: function 'StreamingDataWidthConverter.get_instream_width'
  - Line 144: function 'StreamingDataWidthConverter.get_outstream_width'
  - Line 148: function 'StreamingDataWidthConverter.infer_node_datatype'
  - Line 162: function 'StreamingDataWidthConverter.verify_node'
  - Line 179: function 'StreamingDataWidthConverter.execute_node'
  - Line 190: function 'StreamingDataWidthConverter.get_exp_cycles'
  - Line 222: function 'StreamingDataWidthConverter.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/thresholding.py:
  - Line 384: function 'Thresholding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/vectorvectoractivation.py:
  - Line 1067: function 'VVAU.get_tree_model'
  - Line 1122: function 'VVAU.derive_token_access_vectors'

📄 src/finn/templates/python_driver/driver.py:
  - Line 881: function 'FINNLiveFIFOOverlay.ctrl_read'
  - Line 893: function 'FINNLiveFIFOOverlay.ctrl_write'

📄 src/finn/transformation/fpgadataflow/derive_characteristic.py:
  - Line 1: module 'derive_characteristic.py'
  - Line 45: class 'JustInTimeSynthesizeParallel'
  - Line 46: function 'JustInTimeSynthesizeParallel.__init__'
  - Line 52: function 'JustInTimeSynthesizeParallel.applyNodeLocal'
  - Line 95: class 'JustInTimeSynthesize'
  - Line 96: function 'JustInTimeSynthesize.__init__'
  - Line 102: function 'JustInTimeSynthesize.apply'
  - Line 159: function 'DeriveTokenAccessVectors.__init__'
  - Line 179: function 'DeriveTokenAccessVectors.applyNodeLocal'
  - Line 209: function 'DeriveTokenAccessVectors.apply'
  - Line 227: function 'LocalStretchCharacteristicFunctions.__init__'
  - Line 232: function 'LocalStretchCharacteristicFunctions.applyNodeLocal'
  - Line 324: function 'get_top_producer_period'
  - Line 342: function 'get_top_consumer_period'
  - Line 408: function 'get_nodes_until_converging'
  - Line 419: function 'get_throughput'
  - Line 441: function 'get_parent_throughput'
  - Line 452: function 'get_parent'
  - Line 462: function 'get_consumer'
  - Line 468: function 'get_consumer_throughput'
  - Line 479: function 'get_true_period'
  - Line 486: function 'get_branch_nodes'
  - Line 494: function 'get_branch_volume'
  - Line 537: function 'calculate_peak_volume_delta'
  - Line 594: function 'compute_node_latency_init_periods'
  - Line 601: function 'max_dist'
  - Line 635: function 'get_full_branch_latency'
  - Line 642: function 'assign_extra_fifo_volume'
  - Line 751: function 'HandleBranches.__init__'
  - Line 756: function 'HandleBranches.apply'
  - Line 783: function 'ProducerDelayCharacteristicFunctions.__init__'
  - Line 788: function 'ProducerDelayCharacteristicFunctions.applyNodeLocal'
  - Line 858: function 'DelayCharacteristicFunctions.__init__'
  - Line 863: function 'DelayCharacteristicFunctions.applyNodeLocal'
  - Line 945: function 'inter_token_gaps'
  - Line 964: function 'remove_trailing_duplicates_keep_one'
  - Line 979: function 'remove_leading_duplicates_keep_one'
  - Line 1001: function 'DeriveFIFOSizes.__init__'
  - Line 1029: function 'DeriveFIFOSizes.apply'

📄 src/finn/util/basic.py:
  - Line 410: function 'get_driver_shapes'
  - Line 502: function 'stretch'
  - Line 510: class 'Characteristic_Node'
  - Line 511: function 'Characteristic_Node.__init__'
  - Line 520: function 'Characteristic_Node.sum'
  - Line 581: function 'compress_numpy_to_string'
  - Line 597: function 'decompress_string_to_numpy'
  - Line 609: function 'compute_total_model_fifo_size'

Total missing docstrings: 332

@github-actions
Copy link
Copy Markdown

github-actions bot commented Mar 14, 2026

📋 Docstring Check Report

Docstring check failed!

Missing Docstrings Details:

📄 src/finn/custom_op/fpgadataflow/addstreams.py:

  • Line 1: module 'addstreams.py'
  • Line 43: function 'AddStreams.init'
  • Line 46: function 'AddStreams.get_nodeattr_types'
  • Line 64: function 'AddStreams.get_normal_input_shape'
  • Line 70: function 'AddStreams.get_folded_input_shape'
  • Line 78: function 'AddStreams.get_normal_output_shape'
  • Line 81: function 'AddStreams.get_folded_output_shape'
  • Line 84: function 'AddStreams.infer_node_datatype'
  • Line 139: function 'AddStreams.get_exp_cycles'
  • Line 143: function 'AddStreams.execute_node'
  • Line 155: function 'AddStreams.prepare_tree_model'
  • Line 163: function 'AddStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/channelwise_op.py:

  • Line 1: module 'channelwise_op.py'
  • Line 82: function 'ChannelwiseOp.init'
  • Line 85: function 'ChannelwiseOp.get_nodeattr_types'
  • Line 114: function 'ChannelwiseOp.infer_node_datatype'
  • Line 164: function 'ChannelwiseOp.get_instream_width'
  • Line 174: function 'ChannelwiseOp.get_outstream_width'
  • Line 178: function 'ChannelwiseOp.get_folded_input_shape'
  • Line 191: function 'ChannelwiseOp.get_folded_output_shape'
  • Line 195: function 'ChannelwiseOp.get_normal_input_shape'
  • Line 208: function 'ChannelwiseOp.get_normal_output_shape'
  • Line 212: function 'ChannelwiseOp.get_exp_cycles'
  • Line 216: function 'ChannelwiseOp.execute_node'
  • Line 247: function 'ChannelwiseOp.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py:

  • Line 1: module 'convolutioninputgenerator.py'
  • Line 50: function 'ConvolutionInputGenerator.init'
  • Line 53: function 'ConvolutionInputGenerator.get_nodeattr_types'
  • Line 88: function 'ConvolutionInputGenerator.get_normal_input_shape'
  • Line 94: function 'ConvolutionInputGenerator.get_folded_input_shape'
  • Line 103: function 'ConvolutionInputGenerator.get_normal_output_shape'
  • Line 115: function 'ConvolutionInputGenerator.get_folded_output_shape'
  • Line 134: function 'ConvolutionInputGenerator.infer_node_datatype'
  • Line 179: function 'ConvolutionInputGenerator.get_outstream_width'
  • Line 188: function 'ConvolutionInputGenerator.get_1d_conv_attrs_normalized'
  • Line 214: function 'ConvolutionInputGenerator.get_exp_cycles'
  • Line 217: function 'ConvolutionInputGenerator.bram_estimation'
  • Line 220: function 'ConvolutionInputGenerator.lut_estimation'
  • Line 223: function 'ConvolutionInputGenerator.uram_estimation'
  • Line 226: function 'ConvolutionInputGenerator.execute_node'
  • Line 265: function 'ConvolutionInputGenerator.get_tree_model_uniform_distribution_based'
  • Line 266: function 'ConvolutionInputGenerator.distribute_outputs_uniform'
  • Line 563: function 'ConvolutionInputGenerator.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/duplicatestreams.py:

  • Line 1: module 'duplicatestreams.py'
  • Line 42: function 'DuplicateStreams.init'
  • Line 45: function 'DuplicateStreams.get_nodeattr_types'
  • Line 62: function 'DuplicateStreams.get_num_output_streams'
  • Line 65: function 'DuplicateStreams.get_normal_input_shape'
  • Line 71: function 'DuplicateStreams.get_folded_input_shape'
  • Line 80: function 'DuplicateStreams.get_normal_output_shape'
  • Line 85: function 'DuplicateStreams.get_folded_output_shape'
  • Line 90: function 'DuplicateStreams.make_shape_compatible_op'
  • Line 95: function 'DuplicateStreams.infer_node_datatype'
  • Line 132: function 'DuplicateStreams.get_number_output_values'
  • Line 138: function 'DuplicateStreams.get_exp_cycles'
  • Line 142: function 'DuplicateStreams.execute_node'
  • Line 154: function 'DuplicateStreams.get_tree_model'
  • Line 164: function 'DuplicateStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/fmpadding.py:

  • Line 1: module 'fmpadding.py'
  • Line 41: function 'FMPadding.init'
  • Line 44: function 'FMPadding.get_nodeattr_types'
  • Line 76: function 'FMPadding.get_exp_cycles'
  • Line 84: function 'FMPadding.get_normal_input_shape'
  • Line 90: function 'FMPadding.get_normal_output_shape'
  • Line 97: function 'FMPadding.get_folded_input_shape'
  • Line 106: function 'FMPadding.get_folded_output_shape'
  • Line 115: function 'FMPadding.make_shape_compatible_op'
  • Line 122: function 'FMPadding.infer_node_datatype'
  • Line 135: function 'FMPadding.verify_node'
  • Line 150: function 'FMPadding.get_instream_width'
  • Line 155: function 'FMPadding.get_outstream_width'
  • Line 160: function 'FMPadding.get_number_output_values'
  • Line 164: function 'FMPadding.execute_node'
  • Line 175: function 'FMPadding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/hwcustomop.py:

  • Line 449: function 'HWCustomOp.derive_token_access_vectors'
  • Line 479: function 'HWCustomOp.derive_token_access_vectors_using_tree_model'
  • Line 763: function 'HWCustomOp.accumulate_char_fxn'

📄 src/finn/custom_op/fpgadataflow/labelselect.py:

  • Line 1: module 'labelselect.py'
  • Line 41: function 'LabelSelect.init'
  • Line 55: function 'LabelSelect.get_nodeattr_types'
  • Line 72: function 'LabelSelect.get_normal_input_shape'
  • Line 78: function 'LabelSelect.get_folded_input_shape'
  • Line 87: function 'LabelSelect.get_normal_output_shape'
  • Line 93: function 'LabelSelect.get_folded_output_shape'
  • Line 99: function 'LabelSelect.make_shape_compatible_op'
  • Line 114: function 'LabelSelect.infer_node_datatype'
  • Line 123: function 'LabelSelect.verify_node'
  • Line 147: function 'LabelSelect.get_number_output_values'
  • Line 150: function 'LabelSelect.execute_node'
  • Line 180: function 'LabelSelect.get_exp_cycles'
  • Line 187: function 'LabelSelect.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/matrixvectoractivation.py:

  • Line 1271: function 'MVAU.get_tree_model'
  • Line 1320: function 'MVAU.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/pool.py:

  • Line 233: function 'Pool.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py:

  • Line 1: module 'streamingdatawidthconverter.py'
  • Line 44: function 'StreamingDataWidthConverter.get_nodeattr_types'
  • Line 68: function 'StreamingDataWidthConverter.get_normal_input_shape'
  • Line 72: function 'StreamingDataWidthConverter.get_normal_output_shape'
  • Line 76: function 'StreamingDataWidthConverter.get_iowidth_lcm'
  • Line 81: function 'StreamingDataWidthConverter.needs_lcm'
  • Line 88: function 'StreamingDataWidthConverter.check_divisible_iowidths'
  • Line 91: function 'StreamingDataWidthConverter.get_folded_input_shape'
  • Line 111: function 'StreamingDataWidthConverter.get_folded_output_shape'
  • Line 132: function 'StreamingDataWidthConverter.get_number_input_values'
  • Line 136: function 'StreamingDataWidthConverter.get_number_output_values'
  • Line 140: function 'StreamingDataWidthConverter.get_instream_width'
  • Line 144: function 'StreamingDataWidthConverter.get_outstream_width'
  • Line 148: function 'StreamingDataWidthConverter.infer_node_datatype'
  • Line 162: function 'StreamingDataWidthConverter.verify_node'
  • Line 179: function 'StreamingDataWidthConverter.execute_node'
  • Line 190: function 'StreamingDataWidthConverter.get_exp_cycles'
  • Line 222: function 'StreamingDataWidthConverter.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/thresholding.py:

  • Line 384: function 'Thresholding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/vectorvectoractivation.py:

  • Line 1068: function 'VVAU.get_tree_model'
  • Line 1123: function 'VVAU.derive_token_access_vectors'

📄 src/finn/templates/python_driver/driver.py:

  • Line 881: function 'FINNLiveFIFOOverlay.ctrl_read'
  • Line 893: function 'FINNLiveFIFOOverlay.ctrl_write'

📄 src/finn/transformation/fpgadataflow/derive_characteristic.py:

  • Line 1: module 'derive_characteristic.py'
  • Line 45: class 'JustInTimeSynthesizeParallel'
  • Line 46: function 'JustInTimeSynthesizeParallel.init'
  • Line 52: function 'JustInTimeSynthesizeParallel.applyNodeLocal'
  • Line 95: class 'JustInTimeSynthesize'
  • Line 96: function 'JustInTimeSynthesize.init'
  • Line 102: function 'JustInTimeSynthesize.apply'
  • Line 159: function 'DeriveTokenAccessVectors.init'
  • Line 179: function 'DeriveTokenAccessVectors.applyNodeLocal'
  • Line 209: function 'DeriveTokenAccessVectors.apply'
  • Line 227: function 'LocalStretchCharacteristicFunctions.init'
  • Line 232: function 'LocalStretchCharacteristicFunctions.applyNodeLocal'
  • Line 324: function 'get_top_producer_period'
  • Line 342: function 'get_top_consumer_period'
  • Line 408: function 'get_nodes_until_converging'
  • Line 419: function 'get_throughput'
  • Line 441: function 'get_parent_throughput'
  • Line 452: function 'get_parent'
  • Line 462: function 'get_consumer'
  • Line 468: function 'get_consumer_throughput'
  • Line 479: function 'get_true_period'
  • Line 486: function 'get_branch_nodes'
  • Line 494: function 'get_branch_volume'
  • Line 537: function 'calculate_peak_volume_delta'
  • Line 594: function 'compute_node_latency_init_periods'
  • Line 601: function 'max_dist'
  • Line 635: function 'get_full_branch_latency'
  • Line 642: function 'assign_extra_fifo_volume'
  • Line 751: function 'HandleBranches.init'
  • Line 756: function 'HandleBranches.apply'
  • Line 783: function 'ProducerDelayCharacteristicFunctions.init'
  • Line 788: function 'ProducerDelayCharacteristicFunctions.applyNodeLocal'
  • Line 858: function 'DelayCharacteristicFunctions.init'
  • Line 863: function 'DelayCharacteristicFunctions.applyNodeLocal'
  • Line 945: function 'inter_token_gaps'
  • Line 964: function 'remove_trailing_duplicates_keep_one'
  • Line 979: function 'remove_leading_duplicates_keep_one'
  • Line 1001: function 'DeriveFIFOSizes.init'
  • Line 1029: function 'DeriveFIFOSizes.apply'

📄 src/finn/util/basic.py:

  • Line 450: function 'stretch'
  • Line 458: class 'Characteristic_Node'
  • Line 459: function 'Characteristic_Node.init'
  • Line 468: function 'Characteristic_Node.sum'
  • Line 529: function 'compress_numpy_to_string'
  • Line 545: function 'decompress_string_to_numpy'
  • Line 557: function 'compute_total_model_fifo_size'

Total missing docstrings: 163

How to Fix:

Please add docstrings to the missing functions, classes, and modules listed above.

Docstring Guidelines:

  • All modules should have a module-level docstring
  • All public functions and methods should have docstrings
  • All private functions should have docstrings
  • All classes should have docstrings
  • Use triple quotes (""") for docstrings
  • Follow PEP 257 conventions
Raw output from docstring checker
Checking 20 specified Python file(s) (excluding tests folder):
  - src/finn/analysis/fpgadataflow/dataflow_performance.py
  - src/finn/builder/build_dataflow_config.py
  - src/finn/builder/build_dataflow_steps.py
  - src/finn/custom_op/fpgadataflow/addstreams.py
  - src/finn/custom_op/fpgadataflow/channelwise_op.py
  - src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py
  - src/finn/custom_op/fpgadataflow/duplicatestreams.py
  - src/finn/custom_op/fpgadataflow/fmpadding.py
  - src/finn/custom_op/fpgadataflow/hwcustomop.py
  - src/finn/custom_op/fpgadataflow/labelselect.py
  - src/finn/custom_op/fpgadataflow/matrixvectoractivation.py
  - src/finn/custom_op/fpgadataflow/pool.py
  - src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py
  - src/finn/custom_op/fpgadataflow/thresholding.py
  - src/finn/custom_op/fpgadataflow/vectorvectoractivation.py
  - src/finn/templates/python_driver/driver.py
  - src/finn/transformation/fpgadataflow/derive_characteristic.py
  - src/finn/transformation/fpgadataflow/make_zynq_proj.py
  - src/finn/transformation/fpgadataflow/set_fifo_depths.py
  - src/finn/util/basic.py

❌ Missing docstrings found:

📄 src/finn/custom_op/fpgadataflow/addstreams.py:
  - Line 1: module 'addstreams.py'
  - Line 43: function 'AddStreams.__init__'
  - Line 46: function 'AddStreams.get_nodeattr_types'
  - Line 64: function 'AddStreams.get_normal_input_shape'
  - Line 70: function 'AddStreams.get_folded_input_shape'
  - Line 78: function 'AddStreams.get_normal_output_shape'
  - Line 81: function 'AddStreams.get_folded_output_shape'
  - Line 84: function 'AddStreams.infer_node_datatype'
  - Line 139: function 'AddStreams.get_exp_cycles'
  - Line 143: function 'AddStreams.execute_node'
  - Line 155: function 'AddStreams.prepare_tree_model'
  - Line 163: function 'AddStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/channelwise_op.py:
  - Line 1: module 'channelwise_op.py'
  - Line 82: function 'ChannelwiseOp.__init__'
  - Line 85: function 'ChannelwiseOp.get_nodeattr_types'
  - Line 114: function 'ChannelwiseOp.infer_node_datatype'
  - Line 164: function 'ChannelwiseOp.get_instream_width'
  - Line 174: function 'ChannelwiseOp.get_outstream_width'
  - Line 178: function 'ChannelwiseOp.get_folded_input_shape'
  - Line 191: function 'ChannelwiseOp.get_folded_output_shape'
  - Line 195: function 'ChannelwiseOp.get_normal_input_shape'
  - Line 208: function 'ChannelwiseOp.get_normal_output_shape'
  - Line 212: function 'ChannelwiseOp.get_exp_cycles'
  - Line 216: function 'ChannelwiseOp.execute_node'
  - Line 247: function 'ChannelwiseOp.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py:
  - Line 1: module 'convolutioninputgenerator.py'
  - Line 50: function 'ConvolutionInputGenerator.__init__'
  - Line 53: function 'ConvolutionInputGenerator.get_nodeattr_types'
  - Line 88: function 'ConvolutionInputGenerator.get_normal_input_shape'
  - Line 94: function 'ConvolutionInputGenerator.get_folded_input_shape'
  - Line 103: function 'ConvolutionInputGenerator.get_normal_output_shape'
  - Line 115: function 'ConvolutionInputGenerator.get_folded_output_shape'
  - Line 134: function 'ConvolutionInputGenerator.infer_node_datatype'
  - Line 179: function 'ConvolutionInputGenerator.get_outstream_width'
  - Line 188: function 'ConvolutionInputGenerator.get_1d_conv_attrs_normalized'
  - Line 214: function 'ConvolutionInputGenerator.get_exp_cycles'
  - Line 217: function 'ConvolutionInputGenerator.bram_estimation'
  - Line 220: function 'ConvolutionInputGenerator.lut_estimation'
  - Line 223: function 'ConvolutionInputGenerator.uram_estimation'
  - Line 226: function 'ConvolutionInputGenerator.execute_node'
  - Line 265: function 'ConvolutionInputGenerator.get_tree_model_uniform_distribution_based'
  - Line 266: function 'ConvolutionInputGenerator.distribute_outputs_uniform'
  - Line 563: function 'ConvolutionInputGenerator.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/duplicatestreams.py:
  - Line 1: module 'duplicatestreams.py'
  - Line 42: function 'DuplicateStreams.__init__'
  - Line 45: function 'DuplicateStreams.get_nodeattr_types'
  - Line 62: function 'DuplicateStreams.get_num_output_streams'
  - Line 65: function 'DuplicateStreams.get_normal_input_shape'
  - Line 71: function 'DuplicateStreams.get_folded_input_shape'
  - Line 80: function 'DuplicateStreams.get_normal_output_shape'
  - Line 85: function 'DuplicateStreams.get_folded_output_shape'
  - Line 90: function 'DuplicateStreams.make_shape_compatible_op'
  - Line 95: function 'DuplicateStreams.infer_node_datatype'
  - Line 132: function 'DuplicateStreams.get_number_output_values'
  - Line 138: function 'DuplicateStreams.get_exp_cycles'
  - Line 142: function 'DuplicateStreams.execute_node'
  - Line 154: function 'DuplicateStreams.get_tree_model'
  - Line 164: function 'DuplicateStreams.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/fmpadding.py:
  - Line 1: module 'fmpadding.py'
  - Line 41: function 'FMPadding.__init__'
  - Line 44: function 'FMPadding.get_nodeattr_types'
  - Line 76: function 'FMPadding.get_exp_cycles'
  - Line 84: function 'FMPadding.get_normal_input_shape'
  - Line 90: function 'FMPadding.get_normal_output_shape'
  - Line 97: function 'FMPadding.get_folded_input_shape'
  - Line 106: function 'FMPadding.get_folded_output_shape'
  - Line 115: function 'FMPadding.make_shape_compatible_op'
  - Line 122: function 'FMPadding.infer_node_datatype'
  - Line 135: function 'FMPadding.verify_node'
  - Line 150: function 'FMPadding.get_instream_width'
  - Line 155: function 'FMPadding.get_outstream_width'
  - Line 160: function 'FMPadding.get_number_output_values'
  - Line 164: function 'FMPadding.execute_node'
  - Line 175: function 'FMPadding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/hwcustomop.py:
  - Line 449: function 'HWCustomOp.derive_token_access_vectors'
  - Line 479: function 'HWCustomOp.derive_token_access_vectors_using_tree_model'
  - Line 763: function 'HWCustomOp.accumulate_char_fxn'

📄 src/finn/custom_op/fpgadataflow/labelselect.py:
  - Line 1: module 'labelselect.py'
  - Line 41: function 'LabelSelect.__init__'
  - Line 55: function 'LabelSelect.get_nodeattr_types'
  - Line 72: function 'LabelSelect.get_normal_input_shape'
  - Line 78: function 'LabelSelect.get_folded_input_shape'
  - Line 87: function 'LabelSelect.get_normal_output_shape'
  - Line 93: function 'LabelSelect.get_folded_output_shape'
  - Line 99: function 'LabelSelect.make_shape_compatible_op'
  - Line 114: function 'LabelSelect.infer_node_datatype'
  - Line 123: function 'LabelSelect.verify_node'
  - Line 147: function 'LabelSelect.get_number_output_values'
  - Line 150: function 'LabelSelect.execute_node'
  - Line 180: function 'LabelSelect.get_exp_cycles'
  - Line 187: function 'LabelSelect.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/matrixvectoractivation.py:
  - Line 1271: function 'MVAU.get_tree_model'
  - Line 1320: function 'MVAU.derive_token_access_vectors'

📄 src/finn/custom_op/fpgadataflow/pool.py:
  - Line 233: function 'Pool.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/streamingdatawidthconverter.py:
  - Line 1: module 'streamingdatawidthconverter.py'
  - Line 44: function 'StreamingDataWidthConverter.get_nodeattr_types'
  - Line 68: function 'StreamingDataWidthConverter.get_normal_input_shape'
  - Line 72: function 'StreamingDataWidthConverter.get_normal_output_shape'
  - Line 76: function 'StreamingDataWidthConverter.get_iowidth_lcm'
  - Line 81: function 'StreamingDataWidthConverter.needs_lcm'
  - Line 88: function 'StreamingDataWidthConverter.check_divisible_iowidths'
  - Line 91: function 'StreamingDataWidthConverter.get_folded_input_shape'
  - Line 111: function 'StreamingDataWidthConverter.get_folded_output_shape'
  - Line 132: function 'StreamingDataWidthConverter.get_number_input_values'
  - Line 136: function 'StreamingDataWidthConverter.get_number_output_values'
  - Line 140: function 'StreamingDataWidthConverter.get_instream_width'
  - Line 144: function 'StreamingDataWidthConverter.get_outstream_width'
  - Line 148: function 'StreamingDataWidthConverter.infer_node_datatype'
  - Line 162: function 'StreamingDataWidthConverter.verify_node'
  - Line 179: function 'StreamingDataWidthConverter.execute_node'
  - Line 190: function 'StreamingDataWidthConverter.get_exp_cycles'
  - Line 222: function 'StreamingDataWidthConverter.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/thresholding.py:
  - Line 384: function 'Thresholding.get_tree_model'

📄 src/finn/custom_op/fpgadataflow/vectorvectoractivation.py:
  - Line 1068: function 'VVAU.get_tree_model'
  - Line 1123: function 'VVAU.derive_token_access_vectors'

📄 src/finn/templates/python_driver/driver.py:
  - Line 881: function 'FINNLiveFIFOOverlay.ctrl_read'
  - Line 893: function 'FINNLiveFIFOOverlay.ctrl_write'

📄 src/finn/transformation/fpgadataflow/derive_characteristic.py:
  - Line 1: module 'derive_characteristic.py'
  - Line 45: class 'JustInTimeSynthesizeParallel'
  - Line 46: function 'JustInTimeSynthesizeParallel.__init__'
  - Line 52: function 'JustInTimeSynthesizeParallel.applyNodeLocal'
  - Line 95: class 'JustInTimeSynthesize'
  - Line 96: function 'JustInTimeSynthesize.__init__'
  - Line 102: function 'JustInTimeSynthesize.apply'
  - Line 159: function 'DeriveTokenAccessVectors.__init__'
  - Line 179: function 'DeriveTokenAccessVectors.applyNodeLocal'
  - Line 209: function 'DeriveTokenAccessVectors.apply'
  - Line 227: function 'LocalStretchCharacteristicFunctions.__init__'
  - Line 232: function 'LocalStretchCharacteristicFunctions.applyNodeLocal'
  - Line 324: function 'get_top_producer_period'
  - Line 342: function 'get_top_consumer_period'
  - Line 408: function 'get_nodes_until_converging'
  - Line 419: function 'get_throughput'
  - Line 441: function 'get_parent_throughput'
  - Line 452: function 'get_parent'
  - Line 462: function 'get_consumer'
  - Line 468: function 'get_consumer_throughput'
  - Line 479: function 'get_true_period'
  - Line 486: function 'get_branch_nodes'
  - Line 494: function 'get_branch_volume'
  - Line 537: function 'calculate_peak_volume_delta'
  - Line 594: function 'compute_node_latency_init_periods'
  - Line 601: function 'max_dist'
  - Line 635: function 'get_full_branch_latency'
  - Line 642: function 'assign_extra_fifo_volume'
  - Line 751: function 'HandleBranches.__init__'
  - Line 756: function 'HandleBranches.apply'
  - Line 783: function 'ProducerDelayCharacteristicFunctions.__init__'
  - Line 788: function 'ProducerDelayCharacteristicFunctions.applyNodeLocal'
  - Line 858: function 'DelayCharacteristicFunctions.__init__'
  - Line 863: function 'DelayCharacteristicFunctions.applyNodeLocal'
  - Line 945: function 'inter_token_gaps'
  - Line 964: function 'remove_trailing_duplicates_keep_one'
  - Line 979: function 'remove_leading_duplicates_keep_one'
  - Line 1001: function 'DeriveFIFOSizes.__init__'
  - Line 1029: function 'DeriveFIFOSizes.apply'

📄 src/finn/util/basic.py:
  - Line 450: function 'stretch'
  - Line 458: class 'Characteristic_Node'
  - Line 459: function 'Characteristic_Node.__init__'
  - Line 468: function 'Characteristic_Node.sum'
  - Line 529: function 'compress_numpy_to_string'
  - Line 545: function 'decompress_string_to_numpy'
  - Line 557: function 'compute_total_model_fifo_size'

Total missing docstrings: 163

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants