sinabs 3.0.3.dev1__tar.gz → 3.0.4.dev2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/.github/workflows/ci-pipeline.yml +1 -1
  2. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/ChangeLog +5 -0
  3. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/PKG-INFO +1 -1
  4. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/api/utils.rst +1 -0
  5. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/overview.md +3 -0
  6. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/__init__.py +8 -2
  7. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/backend/dynapcnn/dynapcnn_network.py +2 -2
  8. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/backend/dynapcnn/mapping.py +4 -1
  9. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/utils.py +61 -1
  10. sinabs-3.0.4.dev2/sinabs/validate_memory_speck.py +144 -0
  11. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs.egg-info/PKG-INFO +1 -1
  12. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs.egg-info/SOURCES.txt +1 -0
  13. sinabs-3.0.4.dev2/sinabs.egg-info/pbr.json +1 -0
  14. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_dynapcnn/test_large_net.py +0 -3
  15. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_utils.py +49 -0
  16. sinabs-3.0.3.dev1/sinabs.egg-info/pbr.json +0 -1
  17. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/.coveragerc +0 -0
  18. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/.pre-commit-config.yaml +0 -0
  19. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/.readthedocs.yaml +0 -0
  20. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/AUTHORS +0 -0
  21. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/CITATION.cff +0 -0
  22. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/LICENSE +0 -0
  23. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/Pipfile +0 -0
  24. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/Pipfile.lock +0 -0
  25. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/README.md +0 -0
  26. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/codecov.yml +0 -0
  27. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/Makefile +0 -0
  28. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/_static/Overview/dataflow_layers.png +0 -0
  29. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/_static/Overview/event_preprocessing_pipeline.png +0 -0
  30. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/_static/Overview/memory_constraints.png +0 -0
  31. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/_static/Overview/sinabs-dynapcnn-role.png +0 -0
  32. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/_static/Overview/speck_dynapcnn.png +0 -0
  33. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/_static/Overview/speck_top_level.png +0 -0
  34. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/_static/devkits_images/dynapcnn_devkit.png +0 -0
  35. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/_static/devkits_images/speck_devkit.png +0 -0
  36. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/_static/devkits_images/speck_module.png +0 -0
  37. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/_static/devkits_images/speck_module_devkit.png +0 -0
  38. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/_static/nmnist_quick_start/dvs_input_flow.png +0 -0
  39. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/_static/nmnist_quick_start/dynapcnn_visualizer.png +0 -0
  40. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/_static/nmnist_quick_start/spike_input_flow.png +0 -0
  41. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/_static/power_monitoring/dynamic_power_samna_graph.png +0 -0
  42. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/_static/power_monitoring/idle_power_samna_graph.png +0 -0
  43. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/_static/power_monitoring/power_plot.png +0 -0
  44. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/_static/sinabs-logo-lowercase-whitebg.png +0 -0
  45. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/_static/sinabs-logo-lowercase.png +0 -0
  46. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/_static/tips_for_training/exceeding_bandwidth.png +0 -0
  47. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/_static/using_readout_layer/handcraft_weights.png +0 -0
  48. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/_static/using_readout_layer/neuron_id_mismatch.png +0 -0
  49. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/_static/using_readout_layer/readout_layer.png +0 -0
  50. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/_static/using_readout_layer/samna_graph.png +0 -0
  51. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/_static/visualize_speck_dvs/samna_graph.png +0 -0
  52. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/_static/visualize_spike_count/samna_graph.png +0 -0
  53. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/_static/visualize_spike_count/spike_count.png +0 -0
  54. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/_templates/class_activation.rst +0 -0
  55. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/_templates/class_layer.rst +0 -0
  56. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/about/about.rst +0 -0
  57. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/about/contributing.md +0 -0
  58. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/about/differences.md +0 -0
  59. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/about/info.md +0 -0
  60. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/about/release_notes.md +0 -0
  61. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/api/activation.rst +0 -0
  62. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/api/api.rst +0 -0
  63. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/api/from_torch.rst +0 -0
  64. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/api/hooks.rst +0 -0
  65. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/api/layers.rst +0 -0
  66. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/api/network.rst +0 -0
  67. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/api/nir.rst +0 -0
  68. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/api/synopcounter.rst +0 -0
  69. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/conf.py +0 -0
  70. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/contact.md +0 -0
  71. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/gallery/README.rst +0 -0
  72. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/gallery/layers/README.rst +0 -0
  73. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/gallery/layers/plot_alif.py +0 -0
  74. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/gallery/layers/plot_exp_leaky.py +0 -0
  75. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/gallery/layers/plot_iaf.py +0 -0
  76. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/gallery/layers/plot_lif.py +0 -0
  77. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/gallery/layers/utils.py +0 -0
  78. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/gallery/spike_fns/README.rst +0 -0
  79. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/gallery/spike_fns/plot_maxspike.py +0 -0
  80. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/gallery/spike_fns/plot_multispike.py +0 -0
  81. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/gallery/spike_fns/plot_singlespike.py +0 -0
  82. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/gallery/surrogate_grad_fns/README.rst +0 -0
  83. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/gallery/surrogate_grad_fns/plot_gaussian.py +0 -0
  84. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/gallery/surrogate_grad_fns/plot_heaviside.py +0 -0
  85. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/gallery/surrogate_grad_fns/plot_multigaussian.py +0 -0
  86. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/gallery/surrogate_grad_fns/plot_periodicexponential.py +0 -0
  87. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/gallery/surrogate_grad_fns/plot_singleexponential.py +0 -0
  88. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/getting_started/fundamentals.rst +0 -0
  89. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/getting_started/getting_started.rst +0 -0
  90. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/getting_started/iaf_neuron_model.ipynb +0 -0
  91. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/getting_started/install.rst +0 -0
  92. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/getting_started/python_pyenv_pipenv.rst +0 -0
  93. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/getting_started/quickstart.ipynb +0 -0
  94. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/how_tos/activations.ipynb +0 -0
  95. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/how_tos/custom_hooks.ipynb +0 -0
  96. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/how_tos/how_tos.rst +0 -0
  97. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/how_tos/synops_loss_ann.ipynb +0 -0
  98. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/how_tos/synops_loss_snn.ipynb +0 -0
  99. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/index.md +0 -0
  100. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/make.bat +0 -0
  101. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/plugins/plugins.rst +0 -0
  102. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/requirements.txt +0 -0
  103. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/advanced_concepts.rst +0 -0
  104. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/api/dynapcnn/chip_factory.rst +0 -0
  105. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/api/dynapcnn/config_builder.rst +0 -0
  106. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/api/dynapcnn/crop2d.rst +0 -0
  107. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/api/dynapcnn/discretize.rst +0 -0
  108. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/api/dynapcnn/dvs_layer.rst +0 -0
  109. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/api/dynapcnn/dynapcnn.rst +0 -0
  110. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/api/dynapcnn/dynapcnn_layer.rst +0 -0
  111. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/api/dynapcnn/dynapcnn_network.rst +0 -0
  112. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/api/dynapcnn/dynapcnn_visualizer.rst +0 -0
  113. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/api/dynapcnn/exceptions.rst +0 -0
  114. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/api/dynapcnn/flipdims.rst +0 -0
  115. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/api/dynapcnn/io.rst +0 -0
  116. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/api/dynapcnn/mapping.rst +0 -0
  117. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/api/dynapcnn/specksim.rst +0 -0
  118. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/api/dynapcnn/utils.rst +0 -0
  119. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/dangers.md +0 -0
  120. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/faqs/add_new_device.md +0 -0
  121. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/faqs/available_algorithmic_operation.md +0 -0
  122. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/faqs/available_network_arch.md +0 -0
  123. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/faqs/chip_errata.md +0 -0
  124. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/faqs/device_management.md +0 -0
  125. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/faqs/index.rst +0 -0
  126. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/faqs/output_monitoring.md +0 -0
  127. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/faqs/save_hardware_config_as_binary.md +0 -0
  128. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/faqs/tips_for_training.md +0 -0
  129. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/index.rst +0 -0
  130. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/notebooks/leak_neuron.ipynb +0 -0
  131. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/notebooks/nmnist_quick_start.ipynb +0 -0
  132. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/notebooks/play_with_speck_dvs.ipynb +0 -0
  133. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/notebooks/power_monitoring.ipynb +0 -0
  134. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/notebooks/using_readout_layer.ipynb +0 -0
  135. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/notebooks/visualize_speck_dvs_input.ipynb +0 -0
  136. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/notebooks/visualize_spike_count.ipynb +0 -0
  137. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/specksim.md +0 -0
  138. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/the_basics.md +0 -0
  139. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/tutorials.rst +0 -0
  140. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/speck/visualizer.md +0 -0
  141. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/tutorials/LeNet_5_EngChinese.ipynb +0 -0
  142. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/tutorials/bptt.ipynb +0 -0
  143. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/tutorials/nir_to_speck.ipynb +0 -0
  144. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/tutorials/nmnist.ipynb +0 -0
  145. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/tutorials/scnn_mnist.nir +0 -0
  146. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/tutorials/tutorials.rst +0 -0
  147. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/tutorials/weight_scaling.md +0 -0
  148. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/docs/tutorials/weight_transfer_mnist.ipynb +0 -0
  149. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/examples/mnist/dynapcnn_network.py +0 -0
  150. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/examples/mnist/mnist_params.pt +0 -0
  151. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/examples/mnist/specksim_network.py +0 -0
  152. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/examples/visualizer/dvs_gesture_params.pt +0 -0
  153. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/examples/visualizer/gesture_viz.py +0 -0
  154. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/examples/visualizer/icons/01_armroll.png +0 -0
  155. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/examples/visualizer/icons/02_handclap.png +0 -0
  156. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/examples/visualizer/icons/03_lefthandclockwise.png +0 -0
  157. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/examples/visualizer/icons/04_lefthandcounterclockwise.png +0 -0
  158. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/examples/visualizer/icons/05_lefthandwave.png +0 -0
  159. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/examples/visualizer/icons/06_righthandwave.png +0 -0
  160. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/examples/visualizer/icons/07_righthandclockwise.png +0 -0
  161. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/examples/visualizer/icons/08_righthandcounterclockwise.png +0 -0
  162. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/examples/visualizer/icons/09_airdrums.png +0 -0
  163. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/examples/visualizer/icons/10_airguitar.png +0 -0
  164. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/examples/visualizer/icons/11_other.png +0 -0
  165. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/jupyterlab-requirements.txt +0 -0
  166. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/pull_request_template.md +0 -0
  167. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/requirements.txt +0 -0
  168. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/setup.cfg +0 -0
  169. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/setup.py +0 -0
  170. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/activation/__init__.py +0 -0
  171. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/activation/quantize.py +0 -0
  172. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/activation/reset_mechanism.py +0 -0
  173. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/activation/spike_generation.py +0 -0
  174. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/activation/surrogate_gradient_fn.py +0 -0
  175. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/backend/__init__.py +0 -0
  176. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/backend/dynapcnn/__init__.py +0 -0
  177. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/backend/dynapcnn/chip_factory.py +0 -0
  178. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/backend/dynapcnn/chips/__init__.py +0 -0
  179. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/backend/dynapcnn/chips/dynapcnn.py +0 -0
  180. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/backend/dynapcnn/chips/speck2e.py +0 -0
  181. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/backend/dynapcnn/chips/speck2f.py +0 -0
  182. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/backend/dynapcnn/config_builder.py +0 -0
  183. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/backend/dynapcnn/crop2d.py +0 -0
  184. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/backend/dynapcnn/discretize.py +0 -0
  185. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/backend/dynapcnn/dvs_layer.py +0 -0
  186. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/backend/dynapcnn/dynapcnn_layer.py +0 -0
  187. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/backend/dynapcnn/dynapcnn_visualizer.py +0 -0
  188. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/backend/dynapcnn/exceptions.py +0 -0
  189. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/backend/dynapcnn/flipdims.py +0 -0
  190. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/backend/dynapcnn/io.py +0 -0
  191. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/backend/dynapcnn/specksim.py +0 -0
  192. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/backend/dynapcnn/utils.py +0 -0
  193. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/cnnutils.py +0 -0
  194. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/conversion.py +0 -0
  195. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/from_torch.py +0 -0
  196. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/hooks.py +0 -0
  197. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/layers/__init__.py +0 -0
  198. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/layers/alif.py +0 -0
  199. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/layers/channel_shift.py +0 -0
  200. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/layers/crop2d.py +0 -0
  201. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/layers/exp_leak.py +0 -0
  202. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/layers/functional/__init__.py +0 -0
  203. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/layers/functional/alif.py +0 -0
  204. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/layers/functional/lif.py +0 -0
  205. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/layers/iaf.py +0 -0
  206. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/layers/lif.py +0 -0
  207. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/layers/merge.py +0 -0
  208. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/layers/neuromorphic_relu.py +0 -0
  209. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/layers/pool2d.py +0 -0
  210. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/layers/quantize.py +0 -0
  211. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/layers/reshape.py +0 -0
  212. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/layers/stateful_layer.py +0 -0
  213. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/layers/to_spike.py +0 -0
  214. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/network.py +0 -0
  215. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/nir.py +0 -0
  216. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs/synopcounter.py +0 -0
  217. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs.egg-info/dependency_links.txt +0 -0
  218. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs.egg-info/not-zip-safe +0 -0
  219. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs.egg-info/requires.txt +0 -0
  220. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/sinabs.egg-info/top_level.txt +0 -0
  221. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/inputs_and_results/hooks/conv_input.pth +0 -0
  222. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/inputs_and_results/hooks/conv_layer_synops.pth +0 -0
  223. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/inputs_and_results/hooks/firing_rates.pth +0 -0
  224. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/inputs_and_results/hooks/firing_rates_per_neuron.pth +0 -0
  225. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/inputs_and_results/hooks/input_diffs.pth +0 -0
  226. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/inputs_and_results/hooks/model_synops.pth +0 -0
  227. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/mnist_params.pt +0 -0
  228. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/models/README.txt +0 -0
  229. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/models/synop_hook_model.pth +0 -0
  230. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/requirements.txt +0 -0
  231. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_activations.py +0 -0
  232. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_batch_mismatch.py +0 -0
  233. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_batch_size_update.py +0 -0
  234. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_conversion.py +0 -0
  235. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_copy.py +0 -0
  236. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_dynapcnn/custom_jit_filters.py +0 -0
  237. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_dynapcnn/hw_utils.py +0 -0
  238. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_dynapcnn/test_auto_mapping.py +0 -0
  239. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_dynapcnn/test_compatible_layer_build.py +0 -0
  240. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_dynapcnn/test_config_making.py +0 -0
  241. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_dynapcnn/test_device_movement.py +0 -0
  242. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_dynapcnn/test_device_name_mapping.py +0 -0
  243. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_dynapcnn/test_discover_device.py +0 -0
  244. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_dynapcnn/test_discretized.py +0 -0
  245. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_dynapcnn/test_doorbell.py +0 -0
  246. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_dynapcnn/test_dvs_input.py +0 -0
  247. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_dynapcnn/test_dvs_layer.py +0 -0
  248. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_dynapcnn/test_event_conversion.py +0 -0
  249. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_dynapcnn/test_individual_cases.py +0 -0
  250. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_dynapcnn/test_learning.py +0 -0
  251. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_dynapcnn/test_monitoring.py +0 -0
  252. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_dynapcnn/test_neuron_leak.py +0 -0
  253. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_dynapcnn/test_single_neuron_hardware.py +0 -0
  254. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_dynapcnn/test_speck2e.py +0 -0
  255. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_dynapcnn/test_visualizer.py +0 -0
  256. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_from_model.py +0 -0
  257. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_hooks.py +0 -0
  258. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_layers/test_alif.py +0 -0
  259. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_layers/test_channelshift.py +0 -0
  260. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_layers/test_crop2d.py +0 -0
  261. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_layers/test_exp_leak.py +0 -0
  262. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_layers/test_iaf.py +0 -0
  263. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_layers/test_img2spk.py +0 -0
  264. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_layers/test_lif.py +0 -0
  265. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_layers/test_maxpooling.py +0 -0
  266. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_layers/test_merge.py +0 -0
  267. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_layers/test_neuromorphic_relu.py +0 -0
  268. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_layers/test_reshaping.py +0 -0
  269. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_layers/test_sig2spk.py +0 -0
  270. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_layers/test_stateful_layer.py +0 -0
  271. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_network_class.py +0 -0
  272. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_nir.py +0 -0
  273. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_normalize_weights.py +0 -0
  274. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_onnx.py +0 -0
  275. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_quantize.py +0 -0
  276. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_specksim/test_specksim_bindings.py +0 -0
  277. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_specksim/test_specksim_conversion.py +0 -0
  278. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_specksim/test_specksim_network.py +0 -0
  279. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_surrogate_gradients.py +0 -0
  280. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/test_synops_counter.py +0 -0
  281. {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev2}/tests/weights/README.txt +0 -0
@@ -16,7 +16,7 @@ jobs:
16
16
  fail-fast: false
17
17
  matrix:
18
18
  os: [ubuntu-latest]
19
- python-version: ["3.8","3.10"]
19
+ python-version: ["3.10"]
20
20
  torch-version: ["2.0.0",]
21
21
  steps:
22
22
  - uses: actions/checkout@v4
@@ -1,6 +1,11 @@
1
1
  CHANGES
2
2
  =======
3
3
 
4
+ v3.0.3
5
+
6
+ * Add function in utils to help identify issues with memory constraints when mapping a network on Speck.
7
+ (https://sinabs.readthedocs.io/v3.0.3/api/utils.html#sinabs.utils.validate_memory_mapping_speck)
8
+
4
9
  v3.0.2
5
10
  ------
6
11
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sinabs
3
- Version: 3.0.3.dev1
3
+ Version: 3.0.4.dev2
4
4
  Summary: SynSense Spiking Neural Network simulator for deep neural networks (DNNs).
5
5
  Home-page: UNKNOWN
6
6
  Author: SynSense (formerly AiCTX)
@@ -9,3 +9,4 @@ utils
9
9
  .. autofunction:: sinabs.utils.get_network_activations
10
10
  .. autofunction:: sinabs.utils.normalize_weights
11
11
  .. autofunction:: sinabs.utils.set_batch_size
12
+ .. autofunction:: sinabs.utils.validate_memory_mapping_speck
@@ -151,6 +151,9 @@ The actual Neuron memory entries is then:
151
151
 
152
152
  Where 128Ki neuron exceeds any available neuron memory contrains among 9 layers, thus this layer **CANNOT** be deployed on the chip
153
153
 
154
+ If neuron and kernel memories exceeds the hardware resources, when trying to map the layer a "No valid mapping" error will be thrown.
155
+ When working with Speck and Conv2D layers, we offer a tool to help you to validate if the layer can be mapped: `utils.validate_memory_mapping_speck()`.
156
+
154
157
  #### Leak operation
155
158
 
156
159
  Each layer includes a leak generation block, which will update all the configured neuron states with provided leak values with a clock reference signal. Checkout the [tutorial](notebooks/leak_neuron) on how to use leak feature.
@@ -2,9 +2,15 @@ from pbr.version import VersionInfo
2
2
 
3
3
  __version__ = VersionInfo("sinabs").release_string()
4
4
 
5
- from . import conversion, utils
5
+ from . import conversion, utils, validate_memory_speck
6
6
  from .from_torch import from_model
7
7
  from .network import Network
8
8
  from .nir import from_nir, to_nir
9
9
  from .synopcounter import SNNAnalyzer, SynOpCounter
10
- from .utils import reset_states, set_batch_size, zero_grad
10
+ from .utils import (
11
+ reset_states,
12
+ set_batch_size,
13
+ zero_grad,
14
+ validate_memory_mapping_speck,
15
+ )
16
+ from .validate_memory_speck import ValidateMapping
@@ -361,8 +361,8 @@ class DynapcnnNetwork(nn.Module):
361
361
  try:
362
362
  _, is_compatible = self._make_config(device=device_type)
363
363
  except ValueError as e:
364
- # Catch "No valid mapping found" error
365
- if e.args[0] == ("No valid mapping found"):
364
+ # Catch "No valid mapping found" error, it is the first sentence in the string
365
+ if e.args[0].find("No valid mapping found.") == 0:
366
366
  return False
367
367
  else:
368
368
  raise e
@@ -188,5 +188,8 @@ def recover_mapping(graph, layer_mapping) -> List[Tuple[int, int]]:
188
188
  if edge.flow == 1:
189
189
  mapping.append((i, edge.t - len(layer_mapping) - 1))
190
190
  if len(mapping) != len(layer_mapping):
191
- raise ValueError("No valid mapping found")
191
+ raise ValueError(
192
+ "No valid mapping found. "
193
+ "For Speck family you can use `utils.validate_memory_mapping_speck()` to get more information."
194
+ )
192
195
  return mapping
@@ -1,10 +1,11 @@
1
- from typing import List
1
+ from typing import List, Tuple
2
2
 
3
3
  import numpy as np
4
4
  import torch
5
5
  import torch.nn as nn
6
6
 
7
7
  import sinabs
8
+ from .validate_memory_speck import ValidateMapping
8
9
 
9
10
 
10
11
  def reset_states(model: nn.Module) -> None:
@@ -179,3 +180,62 @@ def set_batch_size(model: nn.Module, batch_size: int):
179
180
  if isinstance(mod, sinabs.layers.SqueezeMixin):
180
181
  mod.batch_size = batch_size
181
182
  # reset_states(mod)
183
+
184
+
185
+ def validate_memory_mapping_speck(
186
+ input_feature_size: int,
187
+ output_feature_size: int,
188
+ kernel_size: Tuple[int, int],
189
+ stride: Tuple[int, int],
190
+ padding: Tuple[int, int],
191
+ input_dimension: Tuple[int, int] = [64, 64],
192
+ conv_2d: bool = True,
193
+ ):
194
+ """Helper function to verify if it is possible to map a specific layer on to speck.
195
+ This function validates kernel and neuron memories. It doesnt check for all the network layers together.
196
+ It considers the mapping of a Conv2D layer only.
197
+
198
+ Args:
199
+ input_feature_size (int): number of input channels
200
+ output_feature_size (int): number of output channels
201
+ kernel_size (Tuple[int, int]): 2D kernel size
202
+ stride (Tuple[int, int]): 2D stride size
203
+ padding (Tuple[int, int]): 2D padding size
204
+ input_dimension (Tuple[int, int]): 2D input dimension size. Defaults to [64,64]
205
+ conv_2d (bool): if it is mapping a Conv2D layers. Defaults to True. It won't validate other types of network.
206
+
207
+ Return:
208
+ msg (string): Message indicating layer can be mapped with total size of kernel and neuron memories.
209
+
210
+ Raises:
211
+ Exception: if neuron or kernel memories are higher than available on chip.
212
+ """
213
+
214
+ if not conv_2d:
215
+ raise ValueError("This function only validates Conv2D layers.")
216
+
217
+ validate = ValidateMapping(
218
+ input_feature_size,
219
+ output_feature_size,
220
+ kernel_size,
221
+ stride,
222
+ padding,
223
+ [input_dimension[0], input_dimension[1]],
224
+ conv_2d,
225
+ )
226
+ (
227
+ kernel,
228
+ neuron,
229
+ kernel_error_msg,
230
+ neuron_error_msg,
231
+ ) = validate.calculate_total_memory()
232
+
233
+ if kernel_error_msg != "" or neuron_error_msg != "":
234
+ raise Exception(kernel_error_msg + neuron_error_msg)
235
+ else:
236
+ msg = (
237
+ "Layer can be mapped successfully. "
238
+ f"Kernel memory is {kernel:g}Ki and neuron memory is {neuron:g}Ki."
239
+ )
240
+
241
+ return msg
@@ -0,0 +1,144 @@
1
+ from typing import Tuple
2
+ from matplotlib import pyplot as plt
3
+ from matplotlib import colors
4
+
5
+ import numpy as np
6
+
7
+
8
+ class ValidateMapping:
9
+ def __init__(
10
+ self,
11
+ input_feature_size: int,
12
+ output_feature_size: int,
13
+ kernel_size: Tuple[int, int],
14
+ stride: Tuple[int, int],
15
+ padding: Tuple[int, int],
16
+ input_dimension: Tuple[int, int] = [64, 64],
17
+ conv_2d: bool = True,
18
+ ):
19
+ self.input_feature_size = input_feature_size
20
+ self.output_feature_size = output_feature_size
21
+
22
+ self.kernel_size = kernel_size
23
+ self.stride = stride
24
+ self.padding = padding
25
+ self.input_dimension = input_dimension
26
+
27
+ # - If not Conv2D layer, assuming it is AvgPool2D layer
28
+ if not conv_2d:
29
+ if (
30
+ kernel_size[0] != kernel_size[1]
31
+ or kernel_size[0] == 3
32
+ or kernel_size[0] > 4
33
+ ):
34
+ raise Exception(
35
+ "Kernel size is limited to 1x1, 2x2 or 4x4 for AvgPool2D layer."
36
+ )
37
+
38
+ if (
39
+ len(kernel_size) > 2
40
+ or len(stride) > 2
41
+ or len(padding) > 2
42
+ or len(input_dimension) > 2
43
+ ):
44
+ raise Exception(
45
+ "We expect input dimension kernel, stride and padding to be 2D elements, i.e.,"
46
+ "to have only two positions: x and y."
47
+ )
48
+
49
+ if kernel_size[0] > 16 or kernel_size[1] > 16:
50
+ raise Exception("Kernel size is limited to, at most, 16x16.")
51
+
52
+ if output_feature_size > 1024:
53
+ raise Exception("Output feature size is limited to, at most, 1024.")
54
+
55
+ if not self.check_stride():
56
+ raise Warning("Kernel stride can be 1, 2, 4 or 8 and, at most, 8x8.")
57
+
58
+ def calculate_total_memory(self):
59
+ kernel_memory = self.calculate_kernel_memory()
60
+ neuron_memory = self.calculate_neuron_memory()
61
+
62
+ kernel_error_msg = self.verify_combined_memories(
63
+ "kernel", kernel_memory, "neuron", neuron_memory
64
+ )
65
+ neuron_error_msg = self.verify_combined_memories(
66
+ "neuron", neuron_memory, "kernel", kernel_memory
67
+ )
68
+
69
+ print(kernel_error_msg)
70
+ print(neuron_error_msg)
71
+ return (
72
+ kernel_memory / 1024,
73
+ neuron_memory / 1024,
74
+ kernel_error_msg,
75
+ neuron_error_msg,
76
+ )
77
+
78
+ def calculate_kernel_memory(self):
79
+ return self.input_feature_size * pow(
80
+ 2,
81
+ np.ceil(np.log2(self.kernel_size[0] * self.kernel_size[1]))
82
+ + np.ceil(np.log2(self.output_feature_size)),
83
+ )
84
+
85
+ def calculate_neuron_memory(self):
86
+ fx = (
87
+ (self.input_dimension[0] - self.kernel_size[0] + 2 * self.padding[0])
88
+ / self.stride[0]
89
+ ) + 1
90
+ fy = (
91
+ (self.input_dimension[1] - self.kernel_size[1] + 2 * self.padding[1])
92
+ / self.stride[1]
93
+ ) + 1
94
+ return self.output_feature_size * pow(
95
+ 2, (np.ceil(np.log2(fx)) + np.ceil(np.log2(fy)))
96
+ )
97
+
98
+ def check_stride(self):
99
+ for i in range(len(self.stride)):
100
+ if (
101
+ self.stride[i] == 1
102
+ or self.stride[i] == 2
103
+ or self.stride[i] == 4
104
+ or self.stride[i] == 8
105
+ ):
106
+ return True
107
+ return False
108
+
109
+ def verify_combined_memories(
110
+ self, base_name: str, base_memory: int, compared_name: str, compared_memory: int
111
+ ):
112
+ # core ids --------- kernel memory -------- neuron memory
113
+ # [0, 1, 2] ------------- 16Ki ----------------- 64Ki
114
+ # [3, 4] ---------------- 32Ki ----------------- 32Ki
115
+ # [5, 6] ---------------- 64Ki ----------------- 16Ki
116
+ # [7, 8] ---------------- 16Ki ----------------- 16Ki
117
+
118
+ base_memory = base_memory / 1024
119
+ compared_memory = compared_memory / 1024
120
+
121
+ error_msg = ""
122
+ if base_memory > 64:
123
+ error_msg = (
124
+ f"{base_name.capitalize()} memory is {base_memory:g}Ki and can not be mapped on chip. "
125
+ f"{base_name.capitalize()} memory on chip needs to be at most 64Ki."
126
+ )
127
+
128
+ if base_memory > 16 and base_memory <= 32:
129
+ if compared_memory > 32:
130
+ error_msg = (
131
+ "There is no core on chip to fit neuron and kernel memories. "
132
+ f"When {base_name} memory is higher than 16Ki, {compared_name} memory needs to be at most 32Ki. "
133
+ f"{base_name.capitalize()} is {base_memory:g}Ki and {compared_name} is {compared_memory:g}Ki."
134
+ )
135
+
136
+ if base_memory > 32:
137
+ if compared_memory > 16:
138
+ error_msg = (
139
+ "There is no core on chip to fit neuron and kernel memories. "
140
+ f"When {base_name} memory is higher than 32Ki, {compared_name} memory needs to be at most 16Ki. "
141
+ f"{base_name.capitalize()} is {base_memory:g}Ki and {compared_name} is {compared_memory:g}Ki."
142
+ )
143
+
144
+ return error_msg
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sinabs
3
- Version: 3.0.3.dev1
3
+ Version: 3.0.4.dev2
4
4
  Summary: SynSense Spiking Neural Network simulator for deep neural networks (DNNs).
5
5
  Home-page: UNKNOWN
6
6
  Author: SynSense (formerly AiCTX)
@@ -164,6 +164,7 @@ sinabs/network.py
164
164
  sinabs/nir.py
165
165
  sinabs/synopcounter.py
166
166
  sinabs/utils.py
167
+ sinabs/validate_memory_speck.py
167
168
  sinabs.egg-info/PKG-INFO
168
169
  sinabs.egg-info/SOURCES.txt
169
170
  sinabs.egg-info/dependency_links.txt
@@ -0,0 +1 @@
1
+ {"git_version": "fbef598", "is_release": false}
@@ -85,7 +85,6 @@ dynapcnn_out = dynapcnn_net(input_data)
85
85
 
86
86
 
87
87
  def test_same_result():
88
- # print(dynapcnn_out)
89
88
  assert torch.equal(dynapcnn_out.squeeze(), snn_out.squeeze())
90
89
 
91
90
 
@@ -137,8 +136,6 @@ def test_to_device():
137
136
  device=device_name, chip_layers_ordering=[0, 1, 2, 7, 4, 5, 6, 3, 8]
138
137
  )
139
138
 
140
- # TODO: this test fails when using speck2e but not speck 2f.
141
- # This has been reported in Samna: https://www.wrike.com/workspace.htm?acc=6529583#/inbox/work_item/1674059530
142
139
  # Close device for safe exit
143
140
  from sinabs.backend.dynapcnn import io
144
141
 
@@ -3,6 +3,7 @@ import torch.nn as nn
3
3
 
4
4
  import sinabs
5
5
  import sinabs.layers as sl
6
+ import sinabs.utils as utils
6
7
 
7
8
 
8
9
  class SNN(nn.Module):
@@ -50,3 +51,51 @@ def test_zero_grad():
50
51
  sinabs.zero_grad(model)
51
52
  assert model.net[1].v_mem.grad_fn is None
52
53
  assert model.net[1].v_mem.sum() != 0
54
+
55
+
56
+ def test_validate_memory_speck_raise_exception():
57
+ import pytest
58
+
59
+ kernel_size = [3, 3]
60
+ stride = [1, 1]
61
+ padding = [1, 1]
62
+ input_feature_size = 64
63
+ output_feature_size = 65
64
+ input_dimension = [8, 8]
65
+
66
+ with pytest.raises(Exception) as info:
67
+ utils.validate_memory_mapping_speck(
68
+ input_feature_size,
69
+ output_feature_size,
70
+ kernel_size,
71
+ stride,
72
+ padding,
73
+ input_dimension,
74
+ )
75
+ assert (
76
+ str(info.value)
77
+ == "Kernel memory is 128Ki and can not be mapped on chip. Kernel memory on chip needs to be at most 64Ki."
78
+ )
79
+
80
+
81
+ def test_validate_memory_speck_no_exception():
82
+ kernel_size = [3, 3]
83
+ stride = [1, 1]
84
+ padding = [1, 1]
85
+ input_feature_size = 2
86
+ output_feature_size = 64
87
+ input_dimension = [8, 8]
88
+
89
+ msg = utils.validate_memory_mapping_speck(
90
+ input_feature_size,
91
+ output_feature_size,
92
+ kernel_size,
93
+ stride,
94
+ padding,
95
+ input_dimension,
96
+ )
97
+
98
+ assert (
99
+ msg
100
+ == "Layer can be mapped successfully. Kernel memory is 2Ki and neuron memory is 4Ki."
101
+ )
@@ -1 +0,0 @@
1
- {"git_version": "b584589", "is_release": false}
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes