NEST main@caf0ae8
 
Loading...
Searching...
No Matches
spike_data.h
Go to the documentation of this file.
1/*
2 * spike_data.h
3 *
4 * This file is part of NEST.
5 *
6 * Copyright (C) 2004 The NEST Initiative
7 *
8 * NEST is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation, either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * NEST is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with NEST. If not, see <http://www.gnu.org/licenses/>.
20 *
21 */
22
23#ifndef SPIKE_DATA_H
24#define SPIKE_DATA_H
25
26// C++ includes
27#include <cassert>
28
29// Includes from nestkernel:
30#include "nest_types.h"
31#include "target.h"
32
33
34namespace nest
35{
36
87
93
101{
102protected:
103 static constexpr int MAX_LAG = generate_max_value( NUM_BITS_LAG );
104
108 unsigned int lag_ : NUM_BITS_LAG;
109 unsigned int tid_ : NUM_BITS_TID;
111
112public:
113 SpikeData();
114 SpikeData( const SpikeData& rhs );
115 SpikeData( const Target& target, const size_t lag, const bool is_flush_event );
116 SpikeData( const size_t tid, const synindex syn_id, const size_t lcid, const unsigned int lag );
117
118 SpikeData& operator=( const SpikeData& rhs );
119
121 void set( const size_t tid, const synindex syn_id, const size_t lcid, const unsigned int lag, const double offset );
122
123 template < class TargetT >
124 void set( const TargetT& target, const unsigned int lag );
125
129 size_t get_lcid() const;
130
136 void set_lcid( size_t );
137
141 unsigned int get_lag() const;
142
146 size_t get_tid() const;
147
151 synindex get_syn_id() const;
152
156 unsigned int get_marker() const;
157
161 void reset_marker();
162
166 void set_complete_marker();
167
171 void set_end_marker();
172
176 void set_invalid_marker();
177
181 bool is_complete_marker() const;
182
186 bool is_end_marker() const;
187
191 bool is_invalid_marker() const;
192
196 bool is_flush_event() const;
197
201 double get_offset() const;
202
207};
208
210using success_spike_data_size = StaticAssert< sizeof( SpikeData ) == 8 >::success;
211
213 : lcid_( 0 )
214 , marker_( SPIKE_DATA_ID_DEFAULT )
215 , flush_event_( FLUSH_EVENT_FALSE )
216 , lag_( 0 )
217 , tid_( 0 )
218 , syn_id_( 0 )
219{
220}
221
222inline SpikeData::SpikeData( const SpikeData& rhs )
223 : lcid_( rhs.lcid_ )
224 , marker_( rhs.marker_ )
225 , flush_event_( rhs.flush_event_ )
226 , lag_( rhs.lag_ )
227 , tid_( rhs.tid_ )
228 , syn_id_( rhs.syn_id_ )
229{
230}
231
232inline SpikeData::SpikeData( const Target& target, const size_t lag, const bool is_flush_event )
233 : lcid_( target.get_lcid() )
234 , marker_( SPIKE_DATA_ID_DEFAULT )
235 , flush_event_( FLUSH_EVENT_FALSE )
236 , lag_( lag )
237 , tid_( target.get_tid() )
238 , syn_id_( target.get_syn_id() )
239{
240 if ( is_flush_event )
241 {
243 }
244}
245
246inline SpikeData::SpikeData( const size_t tid, const synindex syn_id, const size_t lcid, const unsigned int lag )
247 : lcid_( lcid )
248 , marker_( SPIKE_DATA_ID_DEFAULT )
249 , flush_event_( FLUSH_EVENT_FALSE )
250 , lag_( lag )
251 , tid_( tid )
252 , syn_id_( syn_id )
253{
254}
255
256inline SpikeData&
258{
259 lcid_ = rhs.lcid_;
260 marker_ = rhs.marker_;
262 lag_ = rhs.lag_;
263 tid_ = rhs.tid_;
264 syn_id_ = rhs.syn_id_;
265 return *this;
266}
267
268inline void
269SpikeData::set( const size_t tid, const synindex syn_id, const size_t lcid, const unsigned int lag, const double )
270{
271 assert( tid <= MAX_TID ); // MAX_TID is allowed since it is not used as invalid value
272 assert( syn_id < MAX_SYN_ID );
273 assert( lcid < MAX_LCID );
274 assert( lag < MAX_LAG );
275
276 lcid_ = lcid;
278 lag_ = lag;
279 tid_ = tid;
280 syn_id_ = syn_id;
281}
282
283
284template < class TargetT >
285inline void
286SpikeData::set( const TargetT& target, const unsigned int lag )
287{
288 // the assertions in the above function are granted by the TargetT object!
289 assert( lag < MAX_LAG );
290 lcid_ = target.get_lcid();
292 lag_ = lag;
293 tid_ = target.get_tid();
294 syn_id_ = target.get_syn_id();
295}
296
297inline size_t
299{
300 return lcid_;
301}
302
303inline void
304SpikeData::set_lcid( size_t value )
305{
306 assert( value < MAX_LCID );
307 lcid_ = value;
308}
309
310inline unsigned int
312{
313 return lag_;
314}
315
316inline size_t
318{
319 return tid_;
320}
321
322inline synindex
324{
325 return syn_id_;
326}
327
328inline unsigned int
330{
331 return marker_;
332}
333
334inline void
339
340inline void
345
346inline void
351
352inline void
357
358inline bool
363
364inline bool
366{
367 return marker_ == SPIKE_DATA_ID_END;
368}
369
370inline bool
375
376inline bool
381
382inline double
384{
385 return 0;
386}
387
388inline void
393
395{
396private:
397 double offset_;
398
399public:
401 OffGridSpikeData( const Target& target, const size_t lag, const double offset );
402 OffGridSpikeData( const size_t tid,
403 const synindex syn_id,
404 const size_t lcid,
405 const unsigned int lag,
406 const double offset );
409 OffGridSpikeData& operator=( const SpikeData& rhs );
410 void set( const size_t tid, const synindex syn_id, const size_t lcid, const unsigned int lag, const double offset );
411
412 template < class TargetT >
413 void set( const TargetT& target, const unsigned int lag );
414 double get_offset() const;
415};
416
419
421 : SpikeData()
422 , offset_( 0.0 )
423{
424}
425
426inline OffGridSpikeData::OffGridSpikeData( const Target& target, const size_t lag, const double offset )
427 : SpikeData( target, lag, false )
428 , offset_( offset )
429{
430}
431
432inline OffGridSpikeData::OffGridSpikeData( const size_t tid,
433 const synindex syn_id,
434 const size_t lcid,
435 const unsigned int lag,
436 const double offset )
437 : SpikeData( tid, syn_id, lcid, lag )
438 , offset_( offset )
439{
440}
441
443 : SpikeData( rhs )
444 , offset_( rhs.offset_ )
445{
446}
447
448inline OffGridSpikeData&
450{
451 lcid_ = rhs.lcid_;
452 marker_ = rhs.marker_;
453 lag_ = rhs.lag_;
454 tid_ = rhs.tid_;
455 syn_id_ = rhs.syn_id_;
456 offset_ = rhs.offset_;
457 return *this;
458}
459
460inline OffGridSpikeData&
462{
463 // Need to use get_*() here, direct access to protected members of base-class instance is prohibited,
464 // see example in https://en.cppreference.com/w/cpp/language/access.
465 lcid_ = rhs.get_lcid();
466 marker_ = rhs.get_marker();
467 lag_ = rhs.get_lag();
468 tid_ = rhs.get_tid();
469 syn_id_ = rhs.get_syn_id();
470 offset_ = 0;
471 return *this;
472}
473
474inline void
475OffGridSpikeData::set( const size_t tid,
476 const synindex syn_id,
477 const size_t lcid,
478 const unsigned int lag,
479 const double offset )
480{
481 assert( tid <= MAX_TID ); // MAX_TID is allowed since it is not used as invalid value
482 assert( syn_id < MAX_SYN_ID );
483 assert( lcid < MAX_LCID );
484 assert( lag < MAX_LAG );
485
486 lcid_ = lcid;
488 lag_ = lag;
489 tid_ = tid;
490 syn_id_ = syn_id;
491 offset_ = offset;
492}
493
494
495template < class TargetT >
496inline void
497OffGridSpikeData::set( const TargetT& target, const unsigned int lag )
498{
499 SpikeData::set( target, lag );
500 offset_ = target.get_offset();
501}
502
503inline double
505{
506 return offset_;
507}
508
509
516{
517 SpikeDataWithRank( const Target& target, const size_t lag, const bool is_flush_event );
518
519 const size_t rank;
521};
522
523inline SpikeDataWithRank::SpikeDataWithRank( const Target& target, const size_t lag, const bool is_flush_event )
524 : rank( target.get_rank() )
525 , spike_data( target, lag, is_flush_event )
526{
527}
528
535{
536 OffGridSpikeDataWithRank( const Target& target, const size_t lag, const double offset );
537
538 const size_t rank;
540};
541
542inline OffGridSpikeDataWithRank::OffGridSpikeDataWithRank( const Target& target, const size_t lag, const double offset )
543 : rank( target.get_rank() )
544 , spike_data( target, lag, offset )
545{
546}
547
548
549} // namespace nest
550
551#endif /* SPIKE_DATA_H */
Definition spike_data.h:395
OffGridSpikeData()
Definition spike_data.h:420
OffGridSpikeData & operator=(const OffGridSpikeData &rhs)
Definition spike_data.h:449
double offset_
Definition spike_data.h:397
void set(const size_t tid, const synindex syn_id, const size_t lcid, const unsigned int lag, const double offset)
Definition spike_data.h:475
double get_offset() const
Definition spike_data.h:504
Used to communicate spikes.
Definition spike_data.h:101
void set_complete_marker()
Sets the status flag to complete marker.
Definition spike_data.h:341
static constexpr int MAX_LAG
Definition spike_data.h:103
unsigned int marker_
status flag
Definition spike_data.h:106
synindex syn_id_
synapse-type index
Definition spike_data.h:110
void set_invalid_marker()
Sets the status flag to invalid marker.
Definition spike_data.h:353
void set(const size_t tid, const synindex syn_id, const size_t lcid, const unsigned int lag, const double offset)
Required in connection with direct-send events.
Definition spike_data.h:269
bool is_invalid_marker() const
Returns whether the marker is the invalid marker.
Definition spike_data.h:371
void set_lcid(size_t)
Sets lcid value.
Definition spike_data.h:304
double get_offset() const
Returns offset.
Definition spike_data.h:383
synindex get_syn_id() const
Returns synapse-type index.
Definition spike_data.h:323
unsigned int get_lag() const
Returns lag in min-delay interval.
Definition spike_data.h:311
bool is_flush_event() const
Returns whether this spike is a flush event.
Definition spike_data.h:377
bool is_complete_marker() const
Returns whether the marker is the complete marker.
Definition spike_data.h:359
void set_flush_event_flag(bool is_flush_event)
Sets the flush event flag.
Definition spike_data.h:389
SpikeData()
Definition spike_data.h:212
unsigned int lag_
lag in this min-delay interval
Definition spike_data.h:108
size_t lcid_
local connection index
Definition spike_data.h:105
void reset_marker()
Resets the status flag to default value.
Definition spike_data.h:335
SpikeData & operator=(const SpikeData &rhs)
Definition spike_data.h:257
unsigned int flush_event_
flush event flag
Definition spike_data.h:107
bool is_end_marker() const
Returns whether the marker is the end marker.
Definition spike_data.h:365
size_t get_tid() const
Returns thread index.
Definition spike_data.h:317
unsigned int tid_
thread index
Definition spike_data.h:109
unsigned int get_marker() const
Returns marker.
Definition spike_data.h:329
void set_end_marker()
Sets the status flag to end marker.
Definition spike_data.h:347
size_t get_lcid() const
Returns local connection ID.
Definition spike_data.h:298
check legal size
Definition target.h:78
Namespace for the NEST simulation kernel.
Definition beta_normalization_factor.h:33
enum_status_spike_data_id
Mark spike transmission status in SpikeData entries.
Definition spike_data.h:81
@ SPIKE_DATA_ID_COMPLETE
Definition spike_data.h:84
@ SPIKE_DATA_ID_END
Definition spike_data.h:83
@ SPIKE_DATA_ID_DEFAULT
Definition spike_data.h:82
@ SPIKE_DATA_ID_INVALID
Definition spike_data.h:85
constexpr uint8_t NUM_BITS_SYN_ID
Definition nest_types.h:77
constexpr uint8_t NUM_BITS_LCID
Definition nest_types.h:83
constexpr int64_t MAX_TID
Definition nest_types.h:95
StaticAssert< sizeof(OffGridSpikeData)==16 >::success success_offgrid_spike_data_size
check legal size
Definition spike_data.h:418
constexpr uint64_t MAX_SYN_ID
Definition nest_types.h:96
constexpr uint8_t NUM_BITS_TID
Definition nest_types.h:76
StaticAssert< sizeof(SpikeData)==8 >::success success_spike_data_size
check legal size
Definition spike_data.h:210
constexpr uint8_t NUM_BITS_FLUSH_EVENT
Definition nest_types.h:86
constexpr uint64_t generate_max_value(const uint8_t num_bits)
Definition nest_types.h:66
constexpr uint8_t NUM_BITS_MARKER_SPIKE_DATA
Definition nest_types.h:85
enum_flush_event
Definition spike_data.h:89
@ FLUSH_EVENT_TRUE
Definition spike_data.h:91
@ FLUSH_EVENT_FALSE
Definition spike_data.h:90
size_t synindex
For enumerations of synapse types.
Definition nest_types.h:115
constexpr uint8_t NUM_BITS_LAG
Definition nest_types.h:87
constexpr uint64_t MAX_LCID
Definition nest_types.h:93
Combine target rank and spike data information for storage in emitted_off_grid_spikes_register.
Definition spike_data.h:535
OffGridSpikeDataWithRank(const Target &target, const size_t lag, const double offset)
Definition spike_data.h:542
const OffGridSpikeData spike_data
Definition spike_data.h:539
const size_t rank
rank of target neuron
Definition spike_data.h:538
Combine target rank and spike data information for storage in emitted_spikes_register.
Definition spike_data.h:516
SpikeDataWithRank(const Target &target, const size_t lag, const bool is_flush_event)
Definition spike_data.h:523
const SpikeData spike_data
Definition spike_data.h:520
const size_t rank
rank of target neuron
Definition spike_data.h:519
Compile time assertions.
Definition static_assert.h:47