static inline void _print_ring_buffers(uint32_t time) { #if LOG_LEVEL >= LOG_DEBUG log_debug("Ring Buffer\n"); log_debug("----------------------------------------\n"); for (uint32_t n = 0; n < n_neurons; n++) { for (uint32_t t = 0; t < SYNAPSE_TYPE_COUNT; t++) { const char *type_string = synapse_types_get_type_char(t); bool empty = true; for (uint32_t d = 0; d < (1 << SYNAPSE_DELAY_BITS); d++) { empty = empty && (ring_buffers[ synapses_get_ring_buffer_index(d + time, t, n)] == 0); } if (!empty) { log_debug("%3d(%s):", n, type_string); for (uint32_t d = 0; d < (1 << SYNAPSE_DELAY_BITS); d++) { log_debug(" "); uint32_t ring_buffer_index = synapses_get_ring_buffer_index(d + time, t, n); synapses_print_weight(ring_buffers[ring_buffer_index], ring_buffer_to_input_left_shifts[t]); } log_debug("\n"); } } } log_debug("----------------------------------------\n"); #else use(time); #endif // LOG_LEVEL >= LOG_DEBUG }
static inline void _print_synaptic_row(synaptic_row_t synaptic_row) { #if LOG_LEVEL >= LOG_DEBUG log_debug("Synaptic row, at address %08x Num plastic words:%u\n", (uint32_t )synaptic_row, synapse_row_plastic_size(synaptic_row)); if (synaptic_row == NULL) { return; } log_debug("----------------------------------------\n"); // Get details of fixed region address_t fixed_region_address = synapse_row_fixed_region(synaptic_row); address_t fixed_synapses = synapse_row_fixed_weight_controls( fixed_region_address); size_t n_fixed_synapses = synapse_row_num_fixed_synapses( fixed_region_address); log_debug("Fixed region %u fixed synapses (%u plastic control words):\n", n_fixed_synapses, synapse_row_num_plastic_controls(fixed_region_address)); for (uint32_t i = 0; i < n_fixed_synapses; i++) { uint32_t synapse = fixed_synapses[i]; uint32_t synapse_type = synapse_row_sparse_type(synapse); log_debug("%08x [%3d: (w: %5u (=", synapse, i, synapse_row_sparse_weight(synapse)); synapses_print_weight(synapse_row_sparse_weight(synapse), ring_buffer_to_input_left_shifts[synapse_type]); log_debug( "nA) d: %2u, %s, n = %3u)] - {%08x %08x}\n", synapse_row_sparse_delay(synapse), synapse_types_get_type_char(synapse_row_sparse_type(synapse)), synapse_row_sparse_index(synapse), SYNAPSE_DELAY_MASK, SYNAPSE_TYPE_INDEX_BITS); } // If there's a plastic region if (synapse_row_plastic_size(synaptic_row) > 0) { log_debug("----------------------------------------\n"); address_t plastic_region_address = synapse_row_plastic_region(synaptic_row); synapse_dynamics_print_plastic_synapses( plastic_region_address, fixed_region_address, ring_buffer_to_input_left_shifts); } log_debug("----------------------------------------\n"); #else use(synaptic_row); #endif // LOG_LEVEL >= LOG_DEBUG }
void synapse_dynamics_print_plastic_synapses( address_t plastic_region_address, address_t fixed_region_address, uint32_t *ring_buffer_to_input_buffer_left_shifts) { use(plastic_region_address); use(fixed_region_address); use(ring_buffer_to_input_buffer_left_shifts); #if LOG_LEVEL >= LOG_DEBUG // Extract seperate arrays of weights (from plastic region), // Control words (from fixed region) and number of plastic synapses weight_t *plastic_words = _plastic_synapses(plastic_region_address); const control_t *control_words = synapse_row_plastic_controls( fixed_region_address); size_t plastic_synapse = synapse_row_num_plastic_controls( fixed_region_address); const pre_event_history_t *event_history = _plastic_event_history( plastic_region_address); log_debug( "Plastic region %u synapses pre-synaptic event buffer count:%u:\n", plastic_synapse, event_history->count_minus_one + 1); // Loop through plastic synapses for (uint32_t i = 0; i < plastic_synapse; i++) { // Get next weight and control word (autoincrementing control word) uint32_t weight = *plastic_words++; uint32_t control_word = *control_words++; uint32_t synapse_type = synapse_row_sparse_type(control_word); log_debug("%08x [%3d: (w: %5u (=", control_word, i, weight); synapses_print_weight( weight, ring_buffer_to_input_buffer_left_shifts[synapse_type]); log_debug("nA) d: %2u, %s, n = %3u)] - {%08x %08x}\n", synapse_row_sparse_delay(control_word), synapse_types_get_type_char(synapse_row_sparse_type( control_word)), synapse_row_sparse_index(control_word), SYNAPSE_DELAY_MASK, SYNAPSE_TYPE_INDEX_BITS); } #endif // LOG_LEVEL >= LOG_DEBUG }
bool synapses_initialise(address_t address, uint32_t n_neurons_value, input_t **input_buffers_value, uint32_t **ring_buffer_to_input_buffer_left_shifts) { log_info("synapses_initialise: starting"); n_neurons = n_neurons_value; *input_buffers_value = input_buffers; // Set the initial values to 0 for (uint32_t i = 0; i < INPUT_BUFFER_SIZE; i++) { input_buffers[i] = 0; } for (uint32_t i = 0; i < RING_BUFFER_SIZE; i++) { ring_buffers[i] = 0; } // Get the synapse shaping data if (sizeof(synapse_param_t) > 0) { for (index_t synapse_index = 0; synapse_index < SYNAPSE_TYPE_COUNT; synapse_index++) { log_debug("\tCopying %u synapse type %u parameters of size %u", n_neurons, synapse_index, sizeof(synapse_param_t)); // Allocate block of memory for this synapse type'synapse_index // pre-calculated per-neuron decay neuron_synapse_shaping_params[synapse_index] = (synapse_param_t *) spin1_malloc( sizeof(synapse_param_t) * n_neurons); // Check for success if (neuron_synapse_shaping_params[synapse_index] == NULL) { log_error("Cannot allocate neuron synapse parameters" "- Out of DTCM"); return false; } log_debug( "\tCopying %u bytes from %u", n_neurons * sizeof(synapse_param_t), address + ((n_neurons * synapse_index * sizeof(synapse_param_t)) / 4)); memcpy(neuron_synapse_shaping_params[synapse_index], address + ((n_neurons * synapse_index * sizeof(synapse_param_t)) / 4), n_neurons * sizeof(synapse_param_t)); } } // Get the ring buffer left shifts uint32_t ring_buffer_input_left_shifts_base = ((n_neurons * SYNAPSE_TYPE_COUNT * sizeof(synapse_param_t)) / 4); for (index_t synapse_index = 0; synapse_index < SYNAPSE_TYPE_COUNT; synapse_index++) { ring_buffer_to_input_left_shifts[synapse_index] = address[ring_buffer_input_left_shifts_base + synapse_index]; log_info("synapse type %s, ring buffer to input left shift %u", synapse_types_get_type_char(synapse_index), ring_buffer_to_input_left_shifts[synapse_index]); } *ring_buffer_to_input_buffer_left_shifts = ring_buffer_to_input_left_shifts; log_info("synapses_initialise: completed successfully"); return true; }