<Lems xmlns="http://www.neuroml.org/lems/0.7.2"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.neuroml.org/lems/0.7.2">

    <Include file="NeuroMLCoreDimensions.xml"/>
    <Include file="Synapses.xml"/>

    <ComponentType name="spikeGeneratorRefPoisson"
                 extends="spikeGeneratorPoisson"
                 description="Generator of spikes whose ISI distribution is the maximum entropy distribution over [_minimumISI, +infinity) with mean 1/_averageRate">
        <Parameter name="minimumISI" dimension="time"/>
        <Dynamics>
            <StateVariable name="tsince" dimension="time" exposure="tsince"/>
            <StateVariable name="isi" dimension="time"/>
            <TimeDerivative variable="tsince" value="1"/>

            <OnStart>
                <StateAssignment variable="tsince" value="0"/>
                <StateAssignment variable="isi" value="minimumISI - (averageIsi-minimumISI) * log(1 - random(1))"/>
            </OnStart>

            <OnCondition test="tsince .gt. isi">
                <StateAssignment variable="tsince" value="0"/>
                <StateAssignment variable="isi" value="minimumISI - (averageIsi-minimumISI) * log(1 - random(1))"/>
                <EventOut port="spike"/>
            </OnCondition>
        </Dynamics>
    </ComponentType>

    <ComponentType name="spikeGeneratorDelay"
                   extends="spikeGenerator"
                   description="Simple generator of spikes at a regular interval
		     set by _period, emitting the first spike at time
		     _delay + _period.">

        <Parameter name="delay"
                   dimension="time"
                   description="Delay from the start of the simulation."/>
        <Dynamics>
            <StateVariable name="tsince" dimension="time" exposure="tsince"/>

            <TimeDerivative variable="tsince" value="1"/>

            <OnStart>
                <StateAssignment variable="tsince" value="- delay"/>
            </OnStart>

            <OnCondition test="tsince .gt. period">
                <StateAssignment variable="tsince" value="0"/>
                <EventOut port="spike"/>
            </OnCondition>

        </Dynamics>

    </ComponentType>

</Lems>