From df31f434799f2e451a87ddf061078a9e01a27426 Mon Sep 17 00:00:00 2001 From: Luc Grosheintz Date: Tue, 11 Jun 2024 10:40:51 +0200 Subject: [PATCH] Fix calls from NET_RECEIVE. --- src/codegen/codegen_neuron_cpp_visitor.cpp | 4 +++ test/usecases/NetReceiveCalls.mod | 27 ++++++++++++++++++++ test/usecases/net_receive/test_calls.py | 29 ++++++++++++++++++++++ 3 files changed, 60 insertions(+) create mode 100644 test/usecases/NetReceiveCalls.mod create mode 100644 test/usecases/net_receive/test_calls.py diff --git a/src/codegen/codegen_neuron_cpp_visitor.cpp b/src/codegen/codegen_neuron_cpp_visitor.cpp index c013f72df7..c5cfa49405 100644 --- a/src/codegen/codegen_neuron_cpp_visitor.cpp +++ b/src/codegen/codegen_neuron_cpp_visitor.cpp @@ -2129,6 +2129,10 @@ void CodegenNeuronCppVisitor::print_net_receive() { printer->add_line("auto * _ppvar = _nrn_mechanism_access_dparam(_pnt->prop);"); printer->fmt_line("auto inst = make_instance_{}(_lmc);", info.mod_suffix); + printer->fmt_line("// nocmodl has a nullptr dereference for thread variables."); + printer->fmt_line("// NMODL will fail to compile at a later point, because of"); + printer->fmt_line("// missing '_thread_vars'."); + printer->fmt_line("Datum * _thread = nullptr;"); printer->add_line("size_t id = 0;"); printer->add_line("double t = _nt->_t;"); diff --git a/test/usecases/NetReceiveCalls.mod b/test/usecases/NetReceiveCalls.mod new file mode 100644 index 0000000000..69fabe6f46 --- /dev/null +++ b/test/usecases/NetReceiveCalls.mod @@ -0,0 +1,27 @@ +NEURON { + POINT_PROCESS NetReceiveCalls + RANGE c1, c2 +} + +ASSIGNED { + c1 + c2 +} + +INITIAL { + c1 = 0 + c2 = 0 +} + +FUNCTION one() { + one = 1 +} + +PROCEDURE increment_c2() { + c2 = c2 + 2 +} + +NET_RECEIVE(w) { + c1 = c1 + one() + increment_c2() +} diff --git a/test/usecases/net_receive/test_calls.py b/test/usecases/net_receive/test_calls.py new file mode 100644 index 0000000000..21bf4cd580 --- /dev/null +++ b/test/usecases/net_receive/test_calls.py @@ -0,0 +1,29 @@ +import numpy as np + +from neuron import h, gui +from neuron.units import ms + + +def test_calls(): + nseg = 1 + + soma = h.Section() + soma.nseg = nseg + + syn = h.NetReceiveCalls(soma(0.5)) + + stim = h.NetStim() + stim.interval = 0.2 + stim.number = 3 + stim.start = 0.1 + + netcon = h.NetCon(stim, syn) + + h.stdinit() + h.run() + + assert syn.c1 == 3 + assert syn.c2 == 6 + +if __name__ == "__main__": + test_calls()