NEURON
hocmech.cpp
Go to the documentation of this file.
1 #include <../../nrnconf.h>
2 #undef check
3 #include <InterViews/resource.h>
4 #include <ctype.h>
5 #include "membfunc.h"
6 #include "nrnoc2iv.h"
7 #include "nrniv_mf.h"
8 
9 #include "parse.hpp"
10 extern int point_reg_helper(Symbol*);
11 extern Object* hoc_newobj1(Symbol*, int);
12 extern Symlist* hoc_symlist;
13 extern void hoc_unlink_symbol(Symbol*, Symlist*);
14 extern void hoc_link_symbol(Symbol*, Symlist*);
15 extern void nrn_loc_point_process(int, Point_process*, Section*, Node*);
17 extern char* pnt_map;
18 extern Symbol** pointsym;
19 extern Prop* nrn_point_prop_;
20 extern void print_symlist(const char*, Symlist*);
21 
22 extern void make_mechanism();
23 extern void make_pointprocess();
24 extern void hoc_construct_point(Object*, int);
25 extern Object* hoc_new_opoint(int);
26 
28 static bool skip_;
29 
30 static const char** make_m(bool, int&, Symlist*, char*, char*);
31 
32 class HocMech {
33  public:
34  Symbol* mech; // template name
35  Symbol* initial; // INITIAL proc initial()
36  Symbol* after_step; // SOLVE ... METHOD after_cvode;proc after_step()
37  Symlist* slist; // point process range variables.
38  std::vector<double> parm_default{};
39 };
40 
41 static void check(const char* s) {
42  if (hoc_lookup(s)) {
43  hoc_execerror(s, "already exists");
44  }
45 }
46 
47 static void check_list(const char* s, Symlist* sl) {
48  if (hoc_table_lookup(s, sl)) {
49  hoc_execerror(s, "already exists");
50  }
51 }
52 
53 static void seg_or_x_arg_inside_stack(int i, Section** psec, double* px) {
54  extern void (*nrnpy_o2loc_p_)(Object*, Section**, double*);
55  if (hoc_inside_stacktype(i) == NUMBER) {
56  *px = hoc_look_inside_stack<double>(i);
57  *psec = chk_access();
58  } else {
59  Object* o = hoc_look_inside_stack<Object*>(i);
60  *psec = nullptr;
61  if (nrnpy_o2loc_p_) {
62  (*nrnpy_o2loc_p_)(o, psec, px);
63  }
64  assert(*psec);
65  }
66 }
67 
69  if (skip_) {
70  // printf("skipped hoc_construct_point\n");
71  return;
72  }
73  // printf("%s is a pointprocess\n", hoc_object_name(ob));
74  int type = ob->ctemplate->symtable->last->subtype;
75  int ptype = pnt_map[type];
77  ob->u.dataspace[ob->ctemplate->dataspace_size - 1]._pvoid = (void*) pnt;
80  if (narg > 0) {
81  Section* sec;
82  double x;
84  Node* nd = node_exact(sec, x);
85  nrn_loc_point_process(ptype, pnt, sec, nd);
86  }
87 }
88 
90  Point_process* pp;
91  if (ob->ctemplate->steer) {
92  pp = (Point_process*) ob->u.this_pointer;
93  } else {
95  }
96  return pp;
97 }
98 
100  Point_process* pp = ob2pntproc_0(ob);
101  if (!pp || !pp->prop) {
102  hoc_execerror(hoc_object_name(ob), "point process not located in a section");
103  }
104  return pp;
105 }
106 
107 int special_pnt_call(Object* ob, Symbol* sym, int narg) {
108  char* name = sym->name;
109  if (strcmp(name, "loc") == 0) {
110  int type = ob->ctemplate->symtable->last->subtype;
111  int ptype = pnt_map[type];
112  if (narg != 1) {
113  hoc_execerror("no argument", 0);
114  }
115  Section* sec;
116  double x;
118  Node* node = node_exact(sec, x);
120  hoc_pushx(x);
121  return 1;
122  } else if (strcmp(name, "has_loc") == 0) {
123  Point_process* p = ob2pntproc(ob);
124  hoc_pushx(double(p != NULL && p->sec != NULL));
125  return 1;
126  } else if (strcmp(name, "get_loc") == 0) {
128  return 1;
129  } else {
130  return 0;
131  }
132 }
133 
134 static void alloc_mech(Prop* p) {
135  Symbol* mech = ((HocMech*) memb_func[p->_type].hoc_mech)->mech;
136  p->ob = hoc_newobj1(mech, 0);
137  // printf("alloc_mech %s\n", hoc_object_name(p->ob));
138 }
139 
140 static void alloc_pnt(Prop* p) {
141  // this is complex because it can be called either before or
142  // after the hoc object has been created. And so there
143  // must be communication between alloc_pnt and hoc_construct_point.
144  // need the prop->dparam[1]._pvoid
145  if (nrn_point_prop_) {
146  p->dparam = nrn_point_prop_->dparam;
147  p->ob = nrn_point_prop_->ob;
148  // printf("p->ob comes from nrn_point_prop_ %s\n", hoc_object_name(p->ob));
149  } else {
150  p->dparam = nrn_prop_datum_alloc(p->_type, 2, p);
151  if (last_created_pp_ob_) {
152  p->ob = last_created_pp_ob_;
153  // printf("p->ob comes from last_created %s\n", hoc_object_name(p->ob));
154  } else {
155  Symbol* mech = ((HocMech*) memb_func[p->_type].hoc_mech)->mech;
156  skip_ = true;
157  // printf("p->ob comes from hoc_newobj1 %s\n", mech->name);
158  p->ob = hoc_newobj1(mech, 0);
159  skip_ = false;
160  }
161  }
163 }
164 
166  HocMech* hm = (HocMech*) memb_func[type].hoc_mech;
167  return hoc_newobj1(hm->mech, 0);
168 }
169 
170 static void call(Symbol* s, Node* nd, Prop* p) {
171  Section* sec = nd->sec;
172  Object* ob = p->ob;
173  double x = nrn_arc_position(sec, nd);
174  nrn_pushsec(sec);
175  hoc_pushx(x);
176  // printf("hoc_call_objfunc %s ob=%s\n", s->name, hoc_object_name(ob));
177  hoc_call_objfunc(s, 1, ob);
178  nrn_popsec();
179 }
180 
181 static void initial(neuron::model_sorted_token const&, NrnThread* nt, Memb_list* ml, int type) {
182  HocMech* hm = (HocMech*) memb_func[type].hoc_mech;
183  int i, cnt = ml->nodecount;
184  for (i = 0; i < cnt; ++i) {
185  call(hm->initial, ml->nodelist[i], ml->prop[i]);
186  }
187 }
188 
189 static void after_step(neuron::model_sorted_token const&, NrnThread* nt, Memb_list* ml, int type) {
190  HocMech* hm = (HocMech*) memb_func[type].hoc_mech;
191  int i, cnt = ml->nodecount;
192  for (i = 0; i < cnt; ++i) {
193  call(hm->after_step, ml->nodelist[i], ml->prop[i]);
194  }
195 }
196 
197 // note that an sgi CC complained about the alloc token not being interpretable
198 // as std::alloc so we changed to hm_alloc
199 static HocMech* common_register(const char** m,
200  Symbol* classsym,
201  Symlist* slist,
202  void(hm_alloc)(Prop*),
203  int& type) {
204  nrn_cur_t cur{};
205  nrn_init_t initialize{};
206  nrn_jacob_t jacob{};
207  nrn_state_t stat{};
208  HocMech* hm = new HocMech();
209  hm->slist = NULL;
210  hm->mech = classsym;
211  hm->initial = hoc_table_lookup("initial", slist);
212  hm->after_step = hoc_table_lookup("after_step", slist);
213  if (hm->initial) {
214  initialize = initial;
215  }
216  if (hm->after_step) {
217  stat = after_step;
218  }
219  register_mech(m, hm_alloc, cur, jacob, stat, initialize, -1, 0);
220  type = nrn_get_mechtype(m[1]);
221 
222  // parm_default currently empty. That is ok. But fill in if
223  // implementation provides a default method.
225  hoc_register_cvode(type, nullptr, nullptr, nullptr, nullptr);
226  memb_func[type].hoc_mech = hm;
227  return hm;
228 }
229 
231  char buf[256];
232  int i, cnt;
233  Symbol* sp;
234  char* mname = gargstr(1);
235  // printf("mname=%s\n", mname);
236  check(mname);
237  char* classname = gargstr(2);
238  // printf("classname=%s\n", classname);
239  char* parnames = NULL;
240  if (ifarg(3)) {
241  parnames = new char[strlen(gargstr(3)) + 1];
242  strcpy(parnames, gargstr(3));
243  }
244  // if(parnames) printf("parnames=%s\n", parnames);
245  Symbol* classsym = hoc_lookup(classname);
246  if (!classsym || classsym->type != TEMPLATE) {
247  hoc_execerror(classname, "not a template");
248  }
249  cTemplate* tp = classsym->u.ctemplate;
250  Symlist* slist = tp->symtable;
251  const char** m = make_m(true, cnt, slist, mname, parnames);
252 
253  common_register(m, classsym, slist, alloc_mech, i);
254 
255  // no SoA data fields. (the reference to the Hoc Object is in prop->ob)
256  std::vector<std::pair<std::string, int>> params{};
257  std::vector<std::pair<std::string, std::string>> dparams{};
259 
260  for (sp = slist->first; sp; sp = sp->next) {
261  if (sp->type == VAR && sp->cpublic) {
262  Sprintf(buf, "%s_%s", sp->name, m[1]);
263  Symbol* sp1 = hoc_lookup(buf);
264  sp1->u.rng.index = sp->u.oboff;
265  }
266  }
267  for (i = 0; i < cnt; ++i) {
268  if (m[i]) {
269  delete[] m[i];
270  }
271  }
272  delete[] m;
273  delete[] parnames;
274  hoc_retpushx(1.);
275 }
276 
278  int i, cnt, type, ptype;
279  Symbol *sp, *s2;
280  char* classname = gargstr(1);
281  // printf("classname=%s\n", classname);
282  char* parnames = NULL;
283  if (ifarg(2)) {
284  parnames = new char[strlen(gargstr(2)) + 1];
285  strcpy(parnames, gargstr(2));
286  }
287  // if(parnames) printf("parnames=%s\n", parnames);
288  Symbol* classsym = hoc_lookup(classname);
289  if (!classsym || classsym->type != TEMPLATE) {
290  hoc_execerror(classname, "not a template");
291  }
292  cTemplate* tp = classsym->u.ctemplate;
293  Symlist* slist = tp->symtable;
294  // increase the dataspace by 1 void pointer. The last element
295  // is where the Point_process pointer can be found and when
296  // the object dataspace is freed, so is the Point_process.
297  if (tp->count > 0) {
298  fprintf(stderr, "%d object(s) of type %s already exist.\n", tp->count, classsym->name);
299  hoc_execerror("Can't make a template into a PointProcess when instances already exist", 0);
300  }
301  ++tp->dataspace_size;
302  const char** m = make_m(false, cnt, slist, classsym->name, parnames);
303 
304  check_list("loc", slist);
305  check_list("get_loc", slist);
306  check_list("has_loc", slist);
307  // so far we need only the name and type
308  sp = hoc_install("loc", FUNCTION, 0., &slist);
309  sp->cpublic = 1;
310  sp = hoc_install("get_loc", FUNCTION, 0., &slist);
311  sp->cpublic = 1;
312  sp = hoc_install("has_loc", FUNCTION, 0., &slist);
313  sp->cpublic = 1;
314 
315  Symlist* slsav = hoc_symlist;
316  hoc_symlist = NULL;
317  HocMech* hm = common_register(m, classsym, slist, alloc_pnt, type);
318 
319  // Only area and pntproc SoA dparam fields. (the reference to the Hoc Object is in prop->ob)
320  std::vector<std::pair<std::string, int>> params{};
321  std::vector<std::pair<std::string, std::string>> dparams{};
322  dparams.emplace_back("", "area");
323  dparams.emplace_back("", "pntproc");
325 
326  hm->slist = hoc_symlist;
327  hoc_symlist = slsav;
328  s2 = hoc_table_lookup(m[1], hm->slist);
329  assert(s2->subtype == type);
330  // type = s2->subtype;
331  nrn_pnt_template_[type] = tp;
332  ptype = point_reg_helper(s2);
333  // printf("type=%d pointtype=%d %s %p\n", type, ptype, s2->name, s2);
334  classsym->u.ctemplate->is_point_ = ptype;
335 
336  // classsym->name is already in slist as an undef, Remove it and
337  // move s2 out of HocMech->slist and into slist.
338  // That is the one with the u.ppsym.
339  // The only reason it needs to be in slist is to find the
340  // mechanism type. And it needs to be LAST in that list.
341  // The only reason for the u.ppsym is for ndatclas.cpp and we
342  // need to fill those symbols with oboff.
343  sp = hoc_table_lookup(classsym->name, slist);
344  hoc_unlink_symbol(sp, slist);
345  hoc_unlink_symbol(s2, hm->slist);
346  hoc_link_symbol(s2, slist);
347  hoc_link_symbol(sp, hm->slist); // just so it isn't counted as leakage
348  for (i = 0; i < s2->s_varn; ++i) {
349  Symbol* sp = hoc_table_lookup(s2->u.ppsym[i]->name, slist);
350  s2->u.ppsym[i]->cpublic = 2;
351  s2->u.ppsym[i]->u.oboff = sp->u.oboff;
352  }
353  for (i = 0; i < cnt; ++i) {
354  if (m[i]) {
355  delete[] m[i];
356  }
357  }
358  delete[] m;
359  if (parnames) {
360  delete[] parnames;
361  }
362  hoc_retpushx(1.);
363 }
364 
365 static const char** make_m(bool suffix, int& cnt, Symlist* slist, char* mname, char* parnames) {
366  char buf[256];
367  char* cc;
368  Symbol* sp;
369  int i, imax;
370  cnt = 0;
371  for (sp = slist->first; sp; sp = sp->next) {
372  if (sp->type == VAR) {
373  ++cnt;
374  // printf ("cnt=%d |%s|\n", cnt, sp->name);
375  }
376  }
377  cnt += 6;
378  // printf("cnt=%d\n", cnt);
379  const char** m = new const char*[cnt];
380  for (i = 0; i < cnt; ++i) { // not all space is used since some variables
381  m[i] = 0; // are not public
382  }
383  i = 0;
384  cc = new char[2];
385  strcpy(cc, "0");
386  m[i] = cc;
387  // printf("m[%d]=%s\n", i, m[i]);
388  ++i;
389  cc = new char[strlen(mname) + 1];
390  strcpy(cc, mname);
391  m[i] = cc;
392  // printf("m[%d]=%s\n", i, m[i]);
393  ++i;
394 
395  // the remaining part of m must be a 0 separated list of
396  // CONSTANT (actually PARAMETER), ASSIGNED, STATE
397  // Normally these are contiguous in the p array.
398  // At any rate the param array is not the normal representation
399  // of scalar and array values in the object dataspace.
400  // Since the object dataspace representtion is much more flexible
401  // it will be the reponsibility of the allocation routine to
402  // make sure that the style
403  // &(m->param[sym->u.rng.index])
404  // has to actually execute the variant
405  // hoc_objectdata[sym->u.oboff].pval
406  // when assigning and setting from the var_suffix form.
407 
408  // the PARAMETER names are space separated in parnames.
409  char *cp, *csp = NULL;
410  if (parnames)
411  for (cp = parnames; cp && *cp; cp = csp) {
412  csp = strchr(cp, ' ');
413  if (csp) {
414  *csp = '\0';
415  ++csp;
416  if (!isalpha(*csp)) {
417  hoc_execerror("Must be a space separated list of names\n", gargstr(3));
418  }
419  }
420  if (suffix) {
421  Sprintf(buf, "%s_%s", cp, m[1]);
422  check(buf);
423  } else {
424  Sprintf(buf, "%s", cp);
425  }
426  if (!(sp = hoc_table_lookup(cp, slist)) || !sp->cpublic || !(sp->type == VAR)) {
427  hoc_execerror(cp, "is not a public variable");
428  }
429  auto cc_size = strlen(cp) + strlen(m[1]) + 20;
430  cc = new char[cc_size];
431  // above 20 give enough room for _ and possible array size
432  imax = hoc_total_array_data(sp, 0);
433  if (imax > 1) {
434  std::snprintf(cc, cc_size, "%s[%d]", buf, imax);
435  } else {
436  std::snprintf(cc, cc_size, "%s", buf);
437  }
438  m[i] = cc;
439  // printf("m[%d]=%s\n", i, m[i]);
440  ++i;
441  }
442  int j, jmax = i;
443  m[i++] = 0; // CONSTANT ASSIGNED separator
444  // printf("m[%d] = NULL\n", i);
445  for (sp = slist->first; sp; sp = sp->next) {
446  if (sp->type == VAR && sp->cpublic) {
447  if (suffix) {
448  Sprintf(buf, "%s_%s", sp->name, m[1]);
449  check(buf);
450  } else {
451  Sprintf(buf, "%s", sp->name);
452  }
453  bool b = false;
454  for (j = 1; j < jmax; ++j) {
455  if (strstr(m[j], buf)) {
456  b = true; // already a PARAMETER
457  break;
458  }
459  }
460  if (b) {
461  continue;
462  }
463  auto cc_size = strlen(buf) + 20;
464  cc = new char[cc_size];
465  // above 20 give enough room for possible array size
466  imax = hoc_total_array_data(sp, 0);
467  if (imax > 1) {
468  std::snprintf(cc, cc_size, "%s[%d]", buf, imax);
469  } else {
470  std::snprintf(cc, cc_size, "%s", buf);
471  }
472  m[i] = cc;
473  // printf("m[%d]=%s\n", i, m[i]);
474  ++i;
475  }
476  }
477  // printf("m[%d] = NULL\n", i);
478  m[i++] = 0; // ASSIGNED STATE separator
479  // printf("m[%d] = NULL\n", i);
480  m[i++] = 0; // STATE NRNPOINTER separator
481  // printf("m[%d] = NULL\n", i);
482  m[i++] = 0; // end
483  return m;
484 }
Section * chk_access()
Definition: cabcode.cpp:449
void nrn_pushsec(Section *sec)
Definition: cabcode.cpp:130
double nrn_arc_position(Section *sec, Node *node)
Definition: cabcode.cpp:1755
void nrn_popsec(void)
Definition: cabcode.cpp:154
Node * node_exact(Section *sec, double x)
like node_index but give proper node when x is 0 or 1 as well as in between
Definition: cabcode.cpp:1800
Symbol * initial
Definition: hocmech.cpp:35
Symbol * mech
Definition: hocmech.cpp:34
std::vector< double > parm_default
Definition: hocmech.cpp:38
Symbol * after_step
Definition: hocmech.cpp:36
Symlist * slist
Definition: hocmech.cpp:37
Symbol * hoc_table_lookup(const char *, Symlist *)
Definition: symbol.cpp:48
char * gargstr(int narg)
Definition: code2.cpp:227
#define cnt
Definition: tqueue.hpp:44
#define sec
Definition: md1redef.h:20
#define i
Definition: md1redef.h:19
Datum * nrn_prop_datum_alloc(int type, int count, Prop *p)
Definition: cxprop.cpp:33
char buf[512]
Definition: init.cpp:13
void hoc_construct_point(Object *, int)
Definition: hocmech.cpp:68
size_t hoc_total_array_data(const Symbol *s, Objectdata *obd)
Definition: hoc_oop.cpp:95
int hoc_inside_stacktype(int i)
Definition: code.cpp:898
Symbol * hoc_install(const char *, int, double, Symlist **)
Definition: symbol.cpp:77
double hoc_call_objfunc(Symbol *s, int narg, Object *ob)
Definition: hoc_oop.cpp:384
void hoc_retpushx(double x)
Definition: hocusr.cpp:154
char * hoc_object_name(Object *ob)
Definition: hoc_oop.cpp:73
Symbol * hoc_lookup(const char *)
Definition: symbol.cpp:59
#define assert(ex)
Definition: hocassrt.h:24
static void after_step(neuron::model_sorted_token const &, NrnThread *nt, Memb_list *ml, int type)
Definition: hocmech.cpp:189
void hoc_unlink_symbol(Symbol *, Symlist *)
Definition: symbol.cpp:131
Prop * nrn_point_prop_
Definition: point.cpp:29
static void check_list(const char *s, Symlist *sl)
Definition: hocmech.cpp:47
void make_mechanism()
Definition: hocmech.cpp:230
Point_process * ob2pntproc(Object *ob)
Definition: hocmech.cpp:99
void print_symlist(const char *, Symlist *)
Definition: symbol.cpp:40
void make_pointprocess()
Definition: hocmech.cpp:277
cTemplate ** nrn_pnt_template_
Definition: init.cpp:153
Object * hoc_new_opoint(int)
Definition: hocmech.cpp:165
Point_process * ob2pntproc_0(Object *ob)
Definition: hocmech.cpp:89
static void alloc_pnt(Prop *p)
Definition: hocmech.cpp:140
int special_pnt_call(Object *ob, Symbol *sym, int narg)
Definition: hocmech.cpp:107
Object * hoc_newobj1(Symbol *, int)
Definition: hoc_oop.cpp:497
char * pnt_map
Definition: init.cpp:150
static Object * last_created_pp_ob_
Definition: hocmech.cpp:27
static void seg_or_x_arg_inside_stack(int i, Section **psec, double *px)
Definition: hocmech.cpp:53
static void check(const char *s)
Definition: hocmech.cpp:41
void nrn_loc_point_process(int, Point_process *, Section *, Node *)
Definition: point.cpp:76
int point_reg_helper(Symbol *)
Definition: init.cpp:1013
Symbol ** pointsym
Definition: init.cpp:148
Symlist * hoc_symlist
Definition: symbol.cpp:34
static const char ** make_m(bool, int &, Symlist *, char *, char *)
Definition: hocmech.cpp:365
static HocMech * common_register(const char **m, Symbol *classsym, Symlist *slist, void(hm_alloc)(Prop *), int &type)
Definition: hocmech.cpp:199
static bool skip_
Definition: hocmech.cpp:28
static void initial(neuron::model_sorted_token const &, NrnThread *nt, Memb_list *ml, int type)
Definition: hocmech.cpp:181
static void alloc_mech(Prop *p)
Definition: hocmech.cpp:134
static void call(Symbol *s, Node *nd, Prop *p)
Definition: hocmech.cpp:170
void hoc_link_symbol(Symbol *, Symlist *)
Definition: symbol.cpp:155
static int narg()
Definition: ivocvect.cpp:121
void hoc_pushx(double)
Definition: code.cpp:779
nrn_cur_t nrn_state_t
Definition: membfunc.h:43
nrn_cur_t nrn_init_t
Definition: membfunc.h:32
void(*)(neuron::model_sorted_token const &, NrnThread *, Memb_list *, int) nrn_cur_t
Definition: membfunc.h:31
nrn_cur_t nrn_jacob_t
Definition: membfunc.h:33
const char * name
Definition: init.cpp:16
void hoc_execerror(const char *s1, const char *s2)
Definition: nrnoc_aux.cpp:39
int nrn_get_mechtype(const char *name)
Get mechanism type by the mechanism name.
Definition: mk_mech.cpp:145
int register_mech(const char **m, mod_alloc_t alloc, mod_f_t cur, mod_f_t jacob, mod_f_t stat, mod_f_t initialize, mod_f_t private_constructor, mod_f_t private_destructor, int nrnpointerindex, int vectorized)
void register_data_fields(int mechtype, std::vector< std::pair< std::string, int >> const &param_info, std::vector< std::pair< std::string, std::string >> const &dparam_info)
Definition: init.cpp:851
int Sprintf(char(&buf)[N], const char *fmt, Args &&... args)
Redirect sprintf to snprintf if the buffer size can be deduced.
Definition: wrap_sprintf.h:14
static char suffix[256]
Definition: nocpout.cpp:135
static Node * node(Object *)
Definition: netcvode.cpp:291
#define FUNCTION(a, b)
Definition: nrngsl.h:5
size_t p
size_t j
s
Definition: multisend.cpp:521
void * create_point_process(int, Object *)
Definition: point.cpp:33
int ifarg(int)
Definition: code.cpp:1607
double get_loc_point_process(void *)
Definition: point.cpp:217
std::vector< Memb_func > memb_func
Definition: init.cpp:145
short type
Definition: cabvars.h:10
void hoc_register_cvode(int i, nrn_ode_count_t cnt, nrn_ode_map_t map, nrn_ode_spec_t spec, nrn_ode_matsol_t matsol)
Definition: init.cpp:995
void hoc_register_parm_default(int mechtype, const std::vector< double > *pd)
Definition: init.cpp:741
void(* nrnpy_o2loc_p_)(Object *, Section **, double *)
Definition: point.cpp:30
#define NULL
Definition: spdefs.h:105
A view into a set of mechanism instances.
Definition: nrnoc_ml.h:34
int nodecount
Definition: nrnoc_ml.h:78
Node ** nodelist
Definition: nrnoc_ml.h:68
Prop ** prop
Definition: nrnoc_ml.h:76
Definition: section.h:105
Section * sec
Definition: section.h:193
Represent main neuron object computed by single thread.
Definition: multicore.h:58
Definition: hocdec.h:173
void * this_pointer
Definition: hocdec.h:178
Objectdata * dataspace
Definition: hocdec.h:177
cTemplate * ctemplate
Definition: hocdec.h:180
union Object::@47 u
A point process is computed just like regular mechanisms.
Definition: section_fwd.hpp:77
Definition: section.h:231
Datum * dparam
Definition: section.h:247
Object * ob
Definition: section.h:252
Definition: model.h:47
Symbol * next
Definition: hocdec.h:133
union Symbol::@28 u
short cpublic
Definition: hocdec.h:107
Symbol ** ppsym
Definition: hocdec.h:125
struct Symbol::@45::@46 rng
short type
Definition: model.h:48
long subtype
Definition: model.h:49
cTemplate * ctemplate
Definition: hocdec.h:126
unsigned s_varn
Definition: hocdec.h:129
char * name
Definition: model.h:61
int oboff
Definition: hocdec.h:111
Definition: hocdec.h:75
Symbol * last
Definition: hocdec.h:77
Symbol * first
Definition: hocdec.h:76
int dataspace_size
Definition: hocdec.h:149
Symlist * symtable
Definition: hocdec.h:148
int count
Definition: hocdec.h:154
int is_point_
Definition: hocdec.h:150
void(* steer)(void *)
Definition: hocdec.h:160
void * _pvoid
Definition: hocdec.h:170