1 #include <../../nmodlconf.h>
217 #include "parse1.hpp"
220 #define P(arg) fputs(arg, fcout)
241 static List* vectorize_replacements;
242 extern char* cray_pragma();
245 #if __TURBOC__ || SYSV || VMS
267 P(
"/* NOT VECTORIZED */\n");
272 P(
"#include <stdio.h>\n#include <math.h>\n#include \"mathlib.h\"\n");
273 P(
"#include \"common.h\"\n#include \"softbus.h\"\n");
274 P(
"#include \"sbtypes.h\"\n#include \"Solver.h\"\n");
276 P(
"#include <stdio.h>\n#include <math.h>\n#include \"mech_api.h\"\n");
285 P(
"static int _reset;\n");
296 P(
"static int error;\n");
300 P(
"int _ninits = 0;\n");
301 P(
"static int _match_recurse=1;\n");
305 P(
"_modl_cleanup(){ _match_recurse=1;}\n");
314 #if SIMSYS || HMODL || NMODL
316 P(
"static double *_p;\n\n");
330 P(
"\nstatic initmodel() {\n int _i; double _save;");
333 P(
"\ninitmodel() {\n int _i; double _save;");
335 #if (!(SIMSYS || HMODL || NMODL))
336 P(
"\ninitmodel(_pp) double _pp[]; {\n int _i; double _save; _p = _pp;");
339 P(
"_initlists();\n");
347 P(
"\n_init_match(_save);");
355 P(
"\nstatic nrn_init(_pp, _ppd, _v) double *_pp, _v; Datum* _ppd; {\n");
356 P(
" _p = _pp; _ppvar = _ppd;\n");
358 P(
"\nstatic nrn_init(_prop, _v) Prop *_prop; double _v; {\n");
359 P(
" _p = _prop->param; _ppvar = _prop->dparam;\n");
363 P(
" initmodel();\n");
368 P(
"\nstatic double _nrn_current(_v) double _v;{double _current=0.;v=_v;{");
376 P(
"\n} return _current;\n}\n");
381 P(
"\nstatic double nrn_cur(_pp, _ppd, _pdiag, _v) double *_pp, *_pdiag, _v; Datum* _ppd; {\n");
383 P(
"\nstatic double nrn_cur(_prop, _pdiag, _v) Prop *_prop; double *_pdiag, _v;{\n");
386 P(
" double _g, _rhs;\n");
388 P(
" _p = _pp; _ppvar = _ppd;\n");
390 P(
" _p = _prop->param; _ppvar = _prop->dparam;\n");
393 P(
" _g = _nrn_current(_v + .001);\n");
395 P(
" _rhs = _nrn_current(_v);\n");
397 P(
" _g = (_g - _rhs)/.001;\n");
401 P(
" *_pdiag += _g * 1.e2/(_nd_area);\n return (_rhs - _g*_v) * 1.e2/(_nd_area);\n}\n");
403 P(
" *_pdiag += _g;\n return _rhs - _g*_v;\n}\n");
406 P(
" return 0.;\n}\n");
412 P(
"\nstatic nrn_state(_pp, _ppd, _v) double *_pp, _v; Datum* _ppd; {\n");
414 P(
"\nstatic nrn_state(_prop, _v) Prop *_prop; double _v; {\n");
417 P(
" double _break, _save;\n");
419 P(
" _p = _pp; _ppvar = _ppd;\n");
421 P(
" _p = _prop->param; _ppvar = _prop->dparam;\n");
423 P(
" _break = t + .5*dt; _save = t; delta_t = dt;\n");
440 P(
"double _break, _save;\n{\n");
442 P(
"\nmodel(_pp, _indepindex) double _pp[]; int _indepindex; {\n");
443 P(
"double _break, _save;");
456 P(
"\nstatic terminal(){}\n");
463 P(
"\nterminal(_pp) double _pp[];{");
472 #if NMODL || SIMSYS || HMODL
473 P(
"\nstatic _initlists() {\n");
475 P(
"\n_initlists() {\n");
477 P(
" int _i; static int _first = 1;\n");
478 P(
" if (!_first) return;\n");
480 P(
"_first = 0;\n}\n");
503 " for (_i=0; _i<%d; _i++) %s[_i] = %s0;\n",
548 }
else if (
q->itemtype == VERBATIM) {
572 #if GLOBFUNCT && NMODL
591 P(
"/* VECTORIZED */\n");
592 P(
"#include <stdio.h>\n#include <math.h>\n#include \"mech_api.h\"\n");
600 P(
"static int _reset;\n");
608 P(
"static int error;\n");
609 P(
"static int _ninits = 0;\n");
610 P(
"static int _match_recurse=1;\n");
611 P(
"static _modl_cleanup(){ _match_recurse=1;}\n");
625 P(
"\nstatic initmodel(_ix) int _ix; {\n int _i; double _save;");
628 P(
"_initlists(_ix);\n");
637 P(
"\n_init_match(_save);");
643 P(
"\nstatic nrn_init(_count, _nodes, _data, _pdata)\n");
644 P(
" int _count; Node** _nodes; double** _data; Datum** _pdata;\n");
646 P(
" _p = _data; _ppvar = _pdata;\n");
649 P(
" for (_ix = 0; _ix < _count; ++_ix) {\n");
650 P(
" v = _nodes[_ix]->_v;\n");
652 P(
" initmodel(_ix);\n");
658 P(
"\nstatic double _nrn_current(_ix, _v) int _ix; double _v;{\n double _current=0.;v=_v;\n {");
666 P(
"\n} return _current;\n}\n");
671 P(
"\nstatic double nrn_cur(_count, _nodes, _data, _pdata)\n");
672 P(
" int _count; Node** _nodes; double** _data; Datum** _pdata;\n");
676 P(
" _p = _data; _ppvar = _pdata;\n");
679 P(
"\n#if METHOD3\n if (_method3) {\n");
682 P(
" for (_ix = 0; _ix < _count; ++_ix) {\n");
683 P(
" double _g, _rhs, _v;\n");
684 P(
" _v = _nodes[_ix]->_v;\n");
686 P(
" _g = _nrn_current(_ix, _v + .001);\n");
688 P(
"\n _rhs = _nrn_current(_ix, _v);\n");
690 P(
" _g = (_g - _rhs)/.001;\n");
694 P(
" _nodes[_ix]->_d += _g * 1.e2/(_nd_area);\n");
695 P(
" _nodes[_ix]->_rhs += (_g*_v - _rhs) * 1.e2/(_nd_area);\n");
697 P(
" _nodes[_ix]->_thisnode._GC += _g;\n");
698 P(
" _nodes[_ix]->_thisnode._EC += (_g*_v - _rhs);\n");
702 P(
"\n }else\n#endif\n {\n");
706 P(
" for (_ix = 0; _ix < _count; ++_ix) {\n");
707 P(
" double _g, _rhs, _v;\n");
708 P(
" _v = _nodes[_ix]->_v;\n");
710 P(
" _g = _nrn_current(_ix, _v + .001);\n");
712 P(
"\n _rhs = _nrn_current(_ix, _v);\n");
714 P(
" _g = (_g - _rhs)/.001;\n");
718 P(
" _nodes[_ix]->_d += _g * 1.e2/(_nd_area);\n");
719 P(
" _nodes[_ix]->_rhs += (_g*_v - _rhs) * 1.e2/(_nd_area);\n");
721 P(
" _nodes[_ix]->_d += _g;\n");
722 P(
" _nodes[_ix]->_rhs += (_g*_v - _rhs);\n");
729 P(
" return 0.;\n}\n");
734 P(
"\nstatic nrn_state(_count, _nodes, _data, _pdata)\n");
735 P(
" int _count; Node** _nodes; double** _data; Datum** _pdata;\n");
739 P(
" double _break, _save;\n");
740 P(
" _p = _data; _ppvar = _pdata;\n");
742 P(
" _break = t + .5*dt; _save = t; delta_t = dt;\n");
745 P(
" for (_ix = 0; _ix < _count; ++_ix) {\n");
746 P(
" v = _nodes[_ix]->_v;\n");
756 P(
" for (_ix = 0; _ix < _count; ++_ix) {\n");
766 P(
"\nstatic terminal(){}\n");
774 P(
"\nstatic _initlists(){\n");
775 P(
" int _i; static int _first = 1;\n");
776 P(
" if (!_first) return;\n");
778 P(
"_first = 0;\n}\n");
782 if (!vectorize_replacements) {
783 vectorize_replacements =
newlist();
791 if (vectorize_replacements) {
792 ITERATE(
q, vectorize_replacements) {
800 char* cray_pragma() {
804 \n#pragma _CRI ivdep\
#define ITERATE(itm, lst)
NMODL parser global flags / functions.
Item * lappendstr(List *list, char *str)
void replacstr(Item *q, char *s)
Item * lappenditem(List *list, Item *item)
void c_out_vectorize(const char *)
void vectorize_substitute(Item *q, char *str)
void vectorize_do_substitute()
List * get_ion_variables(int)
List * set_ion_variables(int)
List * end_dion_stmt(char *strdel)