diff --git a/ModNEF_Sources/modules/neurons/ShiftLif/shiftlif_parallel.vhd b/ModNEF_Sources/modules/neurons/ShiftLif/shiftlif_parallel.vhd index 6c6989f1f7094fcc5701801c400b3fdb7c2f5e72..32a3aca72754c8862b01753e55ee7938935498a4 100644 --- a/ModNEF_Sources/modules/neurons/ShiftLif/shiftlif_parallel.vhd +++ b/ModNEF_Sources/modules/neurons/ShiftLif/shiftlif_parallel.vhd @@ -127,7 +127,7 @@ architecture Behavioral of ShiftLif_Parallel is end component; -- type definition - type transmission_state_t is (idle, voltage_update, check_arbitration, request, accept, wait_arbitration); + type transmission_state_t is (idle, voltage_update, check_arbitration, request, accept, wait_arbitration, arbitration_finish); type reception_state_t is (idle, request, get_data); -- ram signals @@ -249,9 +249,8 @@ begin when check_arbitration => if spikes = no_spike then - transmission_state <= idle; + transmission_state <= arbitration_finish; o_emu_busy <= '0'; - tr_fsm_en := '0'; else transmission_state <= request; arb_spikes <= spikes; @@ -278,12 +277,15 @@ begin when wait_arbitration => start_arb <= '0'; if arb_busy = '0' then - transmission_state <= idle; - o_emu_busy <= '0'; - tr_fsm_en := '0'; + transmission_state <= arbitration_finish; else transmission_state <= wait_arbitration; end if; + + when arbitration_finish => + transmission_state <= idle; + o_emu_busy <= '0'; + tr_fsm_en := '0'; end case; end if; end if; @@ -337,3 +339,4 @@ begin end generate neuron_generation; end Behavioral; + diff --git a/modneflib/modnef/modnef_driver/drivers/xstep_driver.py b/modneflib/modnef/modnef_driver/drivers/xstep_driver.py index 778b95b1a72a37f0cd6a6a61a0e57aa3c37baad9..6b5b21603d31eef495e290dbe03402801cf5df6c 100644 --- a/modneflib/modnef/modnef_driver/drivers/xstep_driver.py +++ b/modneflib/modnef/modnef_driver/drivers/xstep_driver.py @@ -160,8 +160,9 @@ class XStep_Driver(ModNEF_Driver): step_send += 1 if step == len(sample_aer)-1: + print(len(data)) emulation_result = self.rust_driver.data_transmission(data, reset_membrane) - + print("hi") res_step = self._unpack_data(emulation_result) for rs in res_step: for aer in rs: diff --git a/modneflib/modnef/templates/dataset.py b/modneflib/modnef/templates/dataset.py new file mode 100644 index 0000000000000000000000000000000000000000..e0b86fc5a43069f74cf733e33b7dd16c7d8360af --- /dev/null +++ b/modneflib/modnef/templates/dataset.py @@ -0,0 +1,20 @@ +import os +import tonic +from torch.utils.data import DataLoader + +"""DataSet Definition""" +dataset_path = f"{os.environ['HOME']}/datasets" + +# data set definition, change to your dataset +sensor_size = tonic.datasets.NMNIST.sensor_size +frame_transform = tonic.transforms.ToFrame(sensor_size=sensor_size, n_time_bins=5) + +train_set = tonic.datasets.NMNIST(save_to=dataset_path, train=True, transform=frame_transform) +test_set = tonic.datasets.NMNIST(save_to=dataset_path, train=False, transform=frame_transform) + +# batch loader +batch_size = 64 + +trainLoader = DataLoader(train_set, batch_size=batch_size, shuffle=True, drop_last = True, collate_fn = tonic.collation.PadTensors(batch_first=True)) +testLoader = DataLoader(test_set, batch_size=batch_size, shuffle=True, drop_last = True, collate_fn = tonic.collation.PadTensors(batch_first=True)) +validationLoader = None \ No newline at end of file diff --git a/modneflib/modnef/templates/evaluation.py b/modneflib/modnef/templates/evaluation.py index ebcc8f8f457513ab00649a1ccae38446d243a2cf..91cba66dd98812a08f9cdbe433d2c6db85887f6e 100644 --- a/modneflib/modnef/templates/evaluation.py +++ b/modneflib/modnef/templates/evaluation.py @@ -7,6 +7,7 @@ import torch from run_lib import * import sys from model import MyModel +from dataset import * if __name__ == "__main__": @@ -53,20 +54,7 @@ if __name__ == "__main__": conf_matrix_file = "confusion_matrix.png" conf_matrix_classes = [str(i) for i in range(10)] - """DataSet Definition""" - dataset_path = f"{os.environ['HOME']}/datasets" - - # data set definition, change to your dataset - sensor_size = tonic.datasets.NMNIST.sensor_size - frame_transform = tonic.transforms.ToFrame(sensor_size=sensor_size, n_time_bins=10) - - test_set = tonic.datasets.NMNIST(save_to=dataset_path, train=False, transform=frame_transform) - - # batch loader - batch_size = 64 - testLoader = DataLoader(test_set, batch_size=batch_size, shuffle=True, drop_last = True, collate_fn = tonic.collation.PadTensors(batch_first=True)) - if kind == "eval": acc, y_pred, y_true = evaluation( model=model, @@ -99,7 +87,7 @@ if __name__ == "__main__": exit(-1) if save_conf_matrix: - confusion_matrix( + conf_matrix( y_true=y_true, y_pred=y_pred, file_name=conf_matrix_file, diff --git a/modneflib/modnef/templates/train.py b/modneflib/modnef/templates/train.py index b67de4512337ec34d5c96066df3ed7e8f815a98a..0f481251196a869236f019f777c3ce83f9e01f5e 100644 --- a/modneflib/modnef/templates/train.py +++ b/modneflib/modnef/templates/train.py @@ -6,6 +6,7 @@ from snntorch.surrogate import fast_sigmoid from run_lib import * import torch from model import MyModel +from dataset import * if __name__ == "__main__": @@ -31,23 +32,6 @@ if __name__ == "__main__": save_plot = False save_history = False output_path = "." - - """DataSet Definition""" - dataset_path = f"{os.environ['HOME']}/datasets" - - # data set definition, change to your dataset - sensor_size = tonic.datasets.NMNIST.sensor_size - frame_transform = tonic.transforms.ToFrame(sensor_size=sensor_size, n_time_bins=5) - - train_set = tonic.datasets.NMNIST(save_to=dataset_path, train=True, transform=frame_transform) - test_set = tonic.datasets.NMNIST(save_to=dataset_path, train=False, transform=frame_transform) - - # batch loader - batch_size = 64 - - trainLoader = DataLoader(train_set, batch_size=batch_size, shuffle=True, drop_last = True, collate_fn = tonic.collation.PadTensors(batch_first=True)) - testLoader = DataLoader(test_set, batch_size=batch_size, shuffle=True, drop_last = True, collate_fn = tonic.collation.PadTensors(batch_first=True)) - validationLoader = None train( model=model, diff --git a/modneflib/modnef/templates/vhdl_generation.py b/modneflib/modnef/templates/vhdl_generation.py index fcca214d8959aa06374ae7c4c93aa428ab9fd7a2..563d1a1fb7de009c76d06f4efdd45217cd0c65f7 100644 --- a/modneflib/modnef/templates/vhdl_generation.py +++ b/modneflib/modnef/templates/vhdl_generation.py @@ -6,6 +6,7 @@ from snntorch.surrogate import fast_sigmoid from run_lib import * import torch from model import MyModel +from dataset import * if __name__ == "__main__": @@ -33,21 +34,7 @@ if __name__ == "__main__": """VHDL file definition""" output_path = "." file_name = "template_vhdl_model.vhd" - driver_config_path = "driver_config" - - """DataSet Definition""" - dataset_path = f"{os.environ['HOME']}/datasets" - - # data set definition, change to your dataset - sensor_size = tonic.datasets.NMNIST.sensor_size - frame_transform = tonic.transforms.ToFrame(sensor_size=sensor_size, n_time_bins=10) - - test_set = tonic.datasets.NMNIST(save_to=dataset_path, train=False, transform=frame_transform) - - # batch loader - batch_size = 64 - - testLoader = DataLoader(test_set, batch_size=batch_size, shuffle=True, drop_last = True, collate_fn = tonic.collation.PadTensors(batch_first=True)) + driver_config_path = "driver_config.yml" acc, y_pred, y_true = hardware_estimation( model=model,