void netlist_parser::netdev_device(const pstring &dev_type) { pstring devname; netlist_device_t *dev; int cnt; skipws(); devname = getname2(',', ')'); dev = m_setup.factory().new_device_by_name(dev_type, m_setup); m_setup.register_dev(dev, devname); NL_VERBOSE_OUT(("Parser: IC: %s\n", devname.cstr())); cnt = 0; while (getc() != ')') { skipws(); pstring output_name = getname2(',', ')'); pstring alias = pstring::sprintf("%s.[%d]", devname.cstr(), cnt); NL_VERBOSE_OUT(("Parser: ID: %s %s\n", output_name.cstr(), alias.cstr())); m_setup.register_link(alias, output_name); skipws(); cnt++; } /* if (cnt != dev->m_terminals.count() && !dev->variable_input_count()) fatalerror("netlist: input count mismatch for %s - expected %d found %d\n", devname.cstr(), dev->m_terminals.count(), cnt); if (dev->variable_input_count()) { NL_VERBOSE_OUT(("variable inputs %s: %d\n", dev->name().cstr(), cnt)); } */ }
void netlist_parser::netdev_device(const pstring &dev_type) { pstring devname; net_device_t_base_factory *f = m_setup.factory().factory_by_name(dev_type, m_setup); netlist_device_t *dev; nl_util::pstring_list termlist = f->term_param_list(); pstring def_param = f->def_param(); int cnt; skipws(); devname = getname2(',', ')'); dev = f->Create(); m_setup.register_dev(dev, devname); NL_VERBOSE_OUT(("Parser: IC: %s\n", devname.cstr())); if (def_param != "") { pstring paramfq = devname + "." + def_param; NL_VERBOSE_OUT(("Defparam: %s\n", def_param.cstr())); check_char(','); skipws(); if (peekc() == '"') { pstring val = getstring(); m_setup.register_param(paramfq, val); } else { double val = eval_param(); m_setup.register_param(paramfq, val); } if (termlist.count() > 0) check_char(','); } cnt = 0; while (getc() != ')' && cnt < termlist.count()) { skipws(); pstring output_name = getname2(',', ')'); m_setup.register_link(devname + "." + termlist[cnt], output_name); skipws(); cnt++; } if (cnt != termlist.count()) fatalerror("netlist: input count mismatch for %s - expected %d found %d\n", devname.cstr(), termlist.count(), cnt); }
void netlist_parser::netdev_device(const pstring &dev_type, const pstring &default_param, bool isString) { netlist_device_t *dev; skipws(); pstring devname = getname2(',', ')'); pstring defparam = devname + "." + default_param; dev = m_setup.factory().new_device_by_name(dev_type, m_setup); m_setup.register_dev(dev, devname); NL_VERBOSE_OUT(("Parser: IC: %s\n", devname.cstr())); if (getc() != ')') { // have a default param skipws(); if (isString) { pstring val = getname(')'); ungetc(); NL_VERBOSE_OUT(("Parser: Default param: %s %s\n", defparam.cstr(), val.cstr())); m_setup.register_param(defparam, val); } else { double val = eval_param(); NL_VERBOSE_OUT(("Parser: Default param: %s %f\n", defparam.cstr(), val)); m_setup.register_param(defparam, val); } } check_char(')'); }
double netlist_parser::eval_param() { static const char *macs[6] = {"", "RES_K(", "RES_M(", "CAP_U(", "CAP_N(", "CAP_P("}; static double facs[6] = {1, 1e3, 1e6, 1e-6, 1e-9, 1e-12}; int i; int f=0; bool e; double ret; pstring s = getname2(')',','); for (i=1; i<6;i++) if (strncmp(s.cstr(), macs[i], strlen(macs[i])) == 0) f = i; ret = s.substr(strlen(macs[f])).as_double(&e); if ((f>0) && e) m_setup.netlist().xfatalerror("Parser: Error with parameter ...\n"); if (f>0) check_char(')'); return ret * facs[f]; }
pstring netlist_parser::getname(char sep) { pstring ret = getname2(sep, 0); getc(); // undo the undo ... return ret; }