From 604e27f44f2ffb590a40903415ce5d5e1f9c6c5e Mon Sep 17 00:00:00 2001 From: Nora Abi Akar <nora.abiakar@gmail.com> Date: Mon, 30 Nov 2020 15:36:09 +0100 Subject: [PATCH] Allow arbitrary argument name for NET_RECEIVE (#1258) Fixes #1257 --- modcc/printer/cprinter.cpp | 33 ++++++++++++++++++--------------- modcc/printer/gpuprinter.cpp | 3 ++- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/modcc/printer/cprinter.cpp b/modcc/printer/cprinter.cpp index 9b78f551..0e333686 100644 --- a/modcc/printer/cprinter.cpp +++ b/modcc/printer/cprinter.cpp @@ -369,21 +369,24 @@ std::string emit_cpp_source(const Module& module_, const printer_options& opt) { // Nrn methods: - net_receive && out << - "void " << class_name << "::deliver_events(deliverable_event_stream::state events) {\n" << indent << - "auto ncell = events.n_streams();\n" - "for (size_type c = 0; c<ncell; ++c) {\n" << indent << - "auto begin = events.begin_marked(c);\n" - "auto end = events.end_marked(c);\n" - "for (auto p = begin; p<end; ++p) {\n" << indent << - "if (p->mech_id==mechanism_id_) net_receive(p->mech_index, p->weight);\n" << popindent << - "}\n" << popindent << - "}\n" << popindent << - "}\n" - "\n" - "void " << class_name << "::net_receive(int i_, value_type weight) {\n" << indent << - cprint(net_receive->body()) << popindent << - "}\n\n"; + if (net_receive) { + const std::string weight_arg = net_receive->args().empty() ? "weight" : net_receive->args().front()->is_argument()->name(); + out << + "void " << class_name << "::deliver_events(deliverable_event_stream::state events) {\n" << indent << + "auto ncell = events.n_streams();\n" + "for (size_type c = 0; c<ncell; ++c) {\n" << indent << + "auto begin = events.begin_marked(c);\n" + "auto end = events.end_marked(c);\n" + "for (auto p = begin; p<end; ++p) {\n" << indent << + "if (p->mech_id==mechanism_id_) net_receive(p->mech_index, p->weight);\n" << popindent << + "}\n" << popindent << + "}\n" << popindent << + "}\n" + "\n" + "void " << class_name << "::net_receive(int i_, value_type " << weight_arg << ") {\n" << indent << + cprint(net_receive->body()) << popindent << + "}\n\n"; + } auto emit_body = [&](APIMethod *p) { if (with_simd) { diff --git a/modcc/printer/gpuprinter.cpp b/modcc/printer/gpuprinter.cpp index b685d0fb..b0f67d14 100644 --- a/modcc/printer/gpuprinter.cpp +++ b/modcc/printer/gpuprinter.cpp @@ -293,6 +293,7 @@ std::string emit_gpu_cu_source(const Module& module_, const printer_options& opt // event delivery if (net_receive) { + const std::string weight_arg = net_receive->args().empty() ? "weight" : net_receive->args().front()->is_argument()->name(); out << "__global__\n" << "void deliver_events(int mech_id_, " << ppack_name << " params_, " << "deliverable_event_stream_state events) {\n" << indent @@ -305,7 +306,7 @@ std::string emit_gpu_cu_source(const Module& module_, const printer_options& opt << "for (auto p = begin; p<end; ++p) {\n" << indent << "if (p->mech_id==mech_id_) {\n" << indent << "auto tid_ = p->mech_index;\n" - << "auto weight = p->weight;\n" + << "auto " << weight_arg << " = p->weight;\n" << cuprint(net_receive->body()) << popindent << "}\n" << popindent << "}\n" -- GitLab