sinabs 3.0.3.dev1__tar.gz → 3.0.4.dev1__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.
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/ChangeLog +5 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/PKG-INFO +1 -1
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/api/utils.rst +1 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/overview.md +3 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/__init__.py +8 -2
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/backend/dynapcnn/dynapcnn_network.py +2 -2
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/backend/dynapcnn/mapping.py +4 -1
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/utils.py +61 -1
- sinabs-3.0.4.dev1/sinabs/validate_memory_speck.py +144 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs.egg-info/PKG-INFO +1 -1
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs.egg-info/SOURCES.txt +1 -0
- sinabs-3.0.4.dev1/sinabs.egg-info/pbr.json +1 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_dynapcnn/test_large_net.py +0 -3
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_utils.py +49 -0
- sinabs-3.0.3.dev1/sinabs.egg-info/pbr.json +0 -1
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/.coveragerc +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/.github/workflows/ci-pipeline.yml +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/.pre-commit-config.yaml +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/.readthedocs.yaml +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/AUTHORS +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/CITATION.cff +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/LICENSE +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/Pipfile +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/Pipfile.lock +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/README.md +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/codecov.yml +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/Makefile +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/Overview/dataflow_layers.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/Overview/event_preprocessing_pipeline.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/Overview/memory_constraints.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/Overview/sinabs-dynapcnn-role.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/Overview/speck_dynapcnn.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/Overview/speck_top_level.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/devkits_images/dynapcnn_devkit.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/devkits_images/speck_devkit.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/devkits_images/speck_module.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/devkits_images/speck_module_devkit.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/nmnist_quick_start/dvs_input_flow.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/nmnist_quick_start/dynapcnn_visualizer.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/nmnist_quick_start/spike_input_flow.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/power_monitoring/dynamic_power_samna_graph.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/power_monitoring/idle_power_samna_graph.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/power_monitoring/power_plot.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/sinabs-logo-lowercase-whitebg.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/sinabs-logo-lowercase.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/tips_for_training/exceeding_bandwidth.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/using_readout_layer/handcraft_weights.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/using_readout_layer/neuron_id_mismatch.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/using_readout_layer/readout_layer.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/using_readout_layer/samna_graph.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/visualize_speck_dvs/samna_graph.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/visualize_spike_count/samna_graph.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/visualize_spike_count/spike_count.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_templates/class_activation.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_templates/class_layer.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/about/about.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/about/contributing.md +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/about/differences.md +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/about/info.md +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/about/release_notes.md +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/api/activation.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/api/api.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/api/from_torch.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/api/hooks.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/api/layers.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/api/network.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/api/nir.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/api/synopcounter.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/conf.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/contact.md +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/gallery/README.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/gallery/layers/README.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/gallery/layers/plot_alif.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/gallery/layers/plot_exp_leaky.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/gallery/layers/plot_iaf.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/gallery/layers/plot_lif.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/gallery/layers/utils.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/gallery/spike_fns/README.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/gallery/spike_fns/plot_maxspike.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/gallery/spike_fns/plot_multispike.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/gallery/spike_fns/plot_singlespike.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/gallery/surrogate_grad_fns/README.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/gallery/surrogate_grad_fns/plot_gaussian.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/gallery/surrogate_grad_fns/plot_heaviside.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/gallery/surrogate_grad_fns/plot_multigaussian.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/gallery/surrogate_grad_fns/plot_periodicexponential.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/gallery/surrogate_grad_fns/plot_singleexponential.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/getting_started/fundamentals.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/getting_started/getting_started.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/getting_started/iaf_neuron_model.ipynb +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/getting_started/install.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/getting_started/python_pyenv_pipenv.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/getting_started/quickstart.ipynb +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/how_tos/activations.ipynb +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/how_tos/custom_hooks.ipynb +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/how_tos/how_tos.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/how_tos/synops_loss_ann.ipynb +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/how_tos/synops_loss_snn.ipynb +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/index.md +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/make.bat +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/plugins/plugins.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/requirements.txt +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/advanced_concepts.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/api/dynapcnn/chip_factory.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/api/dynapcnn/config_builder.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/api/dynapcnn/crop2d.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/api/dynapcnn/discretize.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/api/dynapcnn/dvs_layer.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/api/dynapcnn/dynapcnn.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/api/dynapcnn/dynapcnn_layer.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/api/dynapcnn/dynapcnn_network.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/api/dynapcnn/dynapcnn_visualizer.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/api/dynapcnn/exceptions.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/api/dynapcnn/flipdims.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/api/dynapcnn/io.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/api/dynapcnn/mapping.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/api/dynapcnn/specksim.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/api/dynapcnn/utils.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/dangers.md +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/faqs/add_new_device.md +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/faqs/available_algorithmic_operation.md +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/faqs/available_network_arch.md +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/faqs/chip_errata.md +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/faqs/device_management.md +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/faqs/index.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/faqs/output_monitoring.md +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/faqs/save_hardware_config_as_binary.md +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/faqs/tips_for_training.md +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/index.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/notebooks/leak_neuron.ipynb +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/notebooks/nmnist_quick_start.ipynb +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/notebooks/play_with_speck_dvs.ipynb +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/notebooks/power_monitoring.ipynb +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/notebooks/using_readout_layer.ipynb +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/notebooks/visualize_speck_dvs_input.ipynb +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/notebooks/visualize_spike_count.ipynb +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/specksim.md +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/the_basics.md +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/tutorials.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/speck/visualizer.md +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/tutorials/LeNet_5_EngChinese.ipynb +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/tutorials/bptt.ipynb +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/tutorials/nir_to_speck.ipynb +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/tutorials/nmnist.ipynb +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/tutorials/scnn_mnist.nir +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/tutorials/tutorials.rst +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/tutorials/weight_scaling.md +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/tutorials/weight_transfer_mnist.ipynb +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/examples/mnist/dynapcnn_network.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/examples/mnist/mnist_params.pt +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/examples/mnist/specksim_network.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/examples/visualizer/dvs_gesture_params.pt +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/examples/visualizer/gesture_viz.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/examples/visualizer/icons/01_armroll.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/examples/visualizer/icons/02_handclap.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/examples/visualizer/icons/03_lefthandclockwise.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/examples/visualizer/icons/04_lefthandcounterclockwise.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/examples/visualizer/icons/05_lefthandwave.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/examples/visualizer/icons/06_righthandwave.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/examples/visualizer/icons/07_righthandclockwise.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/examples/visualizer/icons/08_righthandcounterclockwise.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/examples/visualizer/icons/09_airdrums.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/examples/visualizer/icons/10_airguitar.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/examples/visualizer/icons/11_other.png +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/jupyterlab-requirements.txt +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/pull_request_template.md +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/requirements.txt +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/setup.cfg +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/setup.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/activation/__init__.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/activation/quantize.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/activation/reset_mechanism.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/activation/spike_generation.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/activation/surrogate_gradient_fn.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/backend/__init__.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/backend/dynapcnn/__init__.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/backend/dynapcnn/chip_factory.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/backend/dynapcnn/chips/__init__.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/backend/dynapcnn/chips/dynapcnn.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/backend/dynapcnn/chips/speck2e.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/backend/dynapcnn/chips/speck2f.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/backend/dynapcnn/config_builder.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/backend/dynapcnn/crop2d.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/backend/dynapcnn/discretize.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/backend/dynapcnn/dvs_layer.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/backend/dynapcnn/dynapcnn_layer.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/backend/dynapcnn/dynapcnn_visualizer.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/backend/dynapcnn/exceptions.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/backend/dynapcnn/flipdims.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/backend/dynapcnn/io.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/backend/dynapcnn/specksim.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/backend/dynapcnn/utils.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/cnnutils.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/conversion.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/from_torch.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/hooks.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/layers/__init__.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/layers/alif.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/layers/channel_shift.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/layers/crop2d.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/layers/exp_leak.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/layers/functional/__init__.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/layers/functional/alif.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/layers/functional/lif.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/layers/iaf.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/layers/lif.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/layers/merge.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/layers/neuromorphic_relu.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/layers/pool2d.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/layers/quantize.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/layers/reshape.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/layers/stateful_layer.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/layers/to_spike.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/network.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/nir.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs/synopcounter.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs.egg-info/dependency_links.txt +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs.egg-info/not-zip-safe +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs.egg-info/requires.txt +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/sinabs.egg-info/top_level.txt +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/inputs_and_results/hooks/conv_input.pth +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/inputs_and_results/hooks/conv_layer_synops.pth +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/inputs_and_results/hooks/firing_rates.pth +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/inputs_and_results/hooks/firing_rates_per_neuron.pth +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/inputs_and_results/hooks/input_diffs.pth +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/inputs_and_results/hooks/model_synops.pth +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/mnist_params.pt +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/models/README.txt +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/models/synop_hook_model.pth +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/requirements.txt +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_activations.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_batch_mismatch.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_batch_size_update.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_conversion.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_copy.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_dynapcnn/custom_jit_filters.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_dynapcnn/hw_utils.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_dynapcnn/test_auto_mapping.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_dynapcnn/test_compatible_layer_build.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_dynapcnn/test_config_making.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_dynapcnn/test_device_movement.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_dynapcnn/test_device_name_mapping.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_dynapcnn/test_discover_device.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_dynapcnn/test_discretized.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_dynapcnn/test_doorbell.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_dynapcnn/test_dvs_input.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_dynapcnn/test_dvs_layer.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_dynapcnn/test_event_conversion.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_dynapcnn/test_individual_cases.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_dynapcnn/test_learning.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_dynapcnn/test_monitoring.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_dynapcnn/test_neuron_leak.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_dynapcnn/test_single_neuron_hardware.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_dynapcnn/test_speck2e.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_dynapcnn/test_visualizer.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_from_model.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_hooks.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_layers/test_alif.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_layers/test_channelshift.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_layers/test_crop2d.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_layers/test_exp_leak.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_layers/test_iaf.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_layers/test_img2spk.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_layers/test_lif.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_layers/test_maxpooling.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_layers/test_merge.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_layers/test_neuromorphic_relu.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_layers/test_reshaping.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_layers/test_sig2spk.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_layers/test_stateful_layer.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_network_class.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_nir.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_normalize_weights.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_onnx.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_quantize.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_specksim/test_specksim_bindings.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_specksim/test_specksim_conversion.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_specksim/test_specksim_network.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_surrogate_gradients.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/test_synops_counter.py +0 -0
- {sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/tests/weights/README.txt +0 -0
|
@@ -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
|
|
|
@@ -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
|
|
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]
|
|
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(
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"git_version": "5f6dcf9", "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
|
{sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/Overview/event_preprocessing_pipeline.png
RENAMED
|
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
|
{sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/nmnist_quick_start/dynapcnn_visualizer.png
RENAMED
|
File without changes
|
{sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/nmnist_quick_start/spike_input_flow.png
RENAMED
|
File without changes
|
{sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/power_monitoring/dynamic_power_samna_graph.png
RENAMED
|
File without changes
|
{sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/power_monitoring/idle_power_samna_graph.png
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/tips_for_training/exceeding_bandwidth.png
RENAMED
|
File without changes
|
{sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/using_readout_layer/handcraft_weights.png
RENAMED
|
File without changes
|
{sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/_static/using_readout_layer/neuron_id_mismatch.png
RENAMED
|
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
|
|
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
|
|
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
|
{sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/gallery/surrogate_grad_fns/plot_multigaussian.py
RENAMED
|
File without changes
|
{sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/gallery/surrogate_grad_fns/plot_periodicexponential.py
RENAMED
|
File without changes
|
{sinabs-3.0.3.dev1 → sinabs-3.0.4.dev1}/docs/gallery/surrogate_grad_fns/plot_singleexponential.py
RENAMED
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|