: $Id: queue.inc,v 1.5 1995/01/17 13:38:39 billl Exp $ COMMENT Handle a synaptic queue used to store spike arrival times for subsequent activation of a synapse after a delay. Actually the time that is stored is (arrival + delay). This is necessary because several spikes may arrive during the course of synaptic activation. These times must be kept track of if they are to influence subsequent events. A queue uses FIFO (first in, first out; cf stack -> FILO) which allows times that are stored to be picked up in the order that they are stored. This is NOT a general use queue. In particular the function of this queue depends on the use of 1e20 as a default 'never' time that is used by both 'popq' and 'pushq' to determine if the queue is exhausted. USAGE: initq() : clears the queue and initializes head and tail pointers pushq(val) : adds val to the end (the tail) of the queue val = popq() : removes a val from the front (the head) of the queue NOTES: QLEN is the length of the queue. If this is changed it must also be changed in the queue[] declaration in the assigned block. ENDCOMMENT NEURON { RANGE head, tail, queu, delay : GLOBAL QLEN : } PARAMETER { delay = 0 (ms) : delay till starting synapse QLEN = 10 : WARNING: if # is changed, then MUST change queu[] below } ASSIGNED { queu[10] : QLEN is length of queue head : tail : } PROCEDURE initq() { head = 0 tail = 0 FROM i = 0 TO (QLEN-1) { queu[i] = 1.0e20 } } PROCEDURE pushq(val) { if (queu[tail] == 1e20) { queu[tail] = val tail = tail + 1 if (tail == QLEN) { tail = 0 } } else { VERBATIM hoc_execerror("Error: queue full.\n",0); ENDVERBATIM } } FUNCTION popq() { popq = queu[head] if (popq == 1e20) { VERBATIM hoc_execerror("Error: queue exhausted.\n",0); ENDVERBATIM } else { queu[head] = 1.e20 head = head + 1 if (head == QLEN) { head = 0 } } }