diff options
Diffstat (limited to 'src')
30 files changed, 260 insertions, 220 deletions
diff --git a/src/lib/netlist/devices/nld_74279.cpp b/src/lib/netlist/devices/nld_74279.cpp index 48c2e7e095b..b95e0184b67 100644 --- a/src/lib/netlist/devices/nld_74279.cpp +++ b/src/lib/netlist/devices/nld_74279.cpp @@ -56,7 +56,7 @@ namespace netlist nld_74279A::truthtable_t nld_74279A::m_ttbl; nld_74279B::truthtable_t nld_74279B::m_ttbl; - const char *nld_74279A::m_desc[] = { + const pstring nld_74279A::m_desc[] = { "S,R,_Q|Q", "0,X,X|1|22", "1,0,X|0|27", @@ -66,7 +66,7 @@ namespace netlist }; - const char *nld_74279B::m_desc[] = { + const pstring nld_74279B::m_desc[] = { "S1,S2,R,_Q|Q", "0,X,X,X|1|22", "X,0,X,X|1|22", diff --git a/src/lib/netlist/devices/nld_7448.cpp b/src/lib/netlist/devices/nld_7448.cpp index 8b4d11c374b..d44c2808a5c 100644 --- a/src/lib/netlist/devices/nld_7448.cpp +++ b/src/lib/netlist/devices/nld_7448.cpp @@ -14,7 +14,7 @@ namespace netlist { #if (USE_TRUTHTABLE_7448 && USE_TRUTHTABLE) - NETLIB_TRUTHTABLE(7448, 7, 7, 0); + NETLIB_TRUTHTABLE(7448, 7, 7); #else @@ -80,7 +80,7 @@ namespace netlist #if (USE_TRUTHTABLE_7448 && USE_TRUTHTABLE) nld_7448::truthtable_t nld_7448::m_ttbl; - const char *nld_7448::m_desc[] = { + const pstring nld_7448::m_desc[] = { " LTQ,BIQ,RBIQ, A , B , C , D | a, b, c, d, e, f, g", " 1, 1, 1, 0, 0, 0, 0 | 1, 1, 1, 1, 1, 1, 0|100,100,100,100,100,100,100", diff --git a/src/lib/netlist/devices/nld_9312.cpp b/src/lib/netlist/devices/nld_9312.cpp index 2ad298f368a..5f22d8d0640 100644 --- a/src/lib/netlist/devices/nld_9312.cpp +++ b/src/lib/netlist/devices/nld_9312.cpp @@ -130,7 +130,7 @@ namespace netlist * do this right now. */ - const char *nld_9312::m_desc[] = { + const pstring nld_9312::m_desc[] = { " C, B, A, G,D0,D1,D2,D3,D4,D5,D6,D7| Y,YQ", " X, X, X, 1, X, X, X, X, X, X, X, X| 0, 1|33,19", " 0, 0, 0, 0, 0, X, X, X, X, X, X, X| 0, 1|33,28", diff --git a/src/lib/netlist/devices/nld_log.cpp b/src/lib/netlist/devices/nld_log.cpp index 17661de803d..2065b36ddaf 100644 --- a/src/lib/netlist/devices/nld_log.cpp +++ b/src/lib/netlist/devices/nld_log.cpp @@ -20,21 +20,22 @@ namespace netlist { NETLIB_CONSTRUCTOR(log) , m_I(*this, "I") + , m_strm(plib::pfmt("{1}.log")(this->name())) + , m_writer(m_strm) { - pstring filename = plib::pfmt("{1}.log")(this->name()); - m_strm = plib::make_unique<plib::pofilestream>(filename); } NETLIB_UPDATEI() { /* use pstring::sprintf, it is a LOT faster */ - m_strm->writeline(plib::pfmt("{1} {2}").e(netlist().time().as_double(),".9").e(static_cast<double>(m_I()))); + m_writer.writeline(plib::pfmt("{1} {2}").e(netlist().time().as_double(),".9").e(static_cast<double>(m_I()))); } NETLIB_RESETI() { } protected: analog_input_t m_I; - std::unique_ptr<plib::pofilestream> m_strm; + plib::pofilestream m_strm; + plib::putf8_writer m_writer; }; NETLIB_OBJECT_DERIVED(logD, log) @@ -46,7 +47,7 @@ namespace netlist NETLIB_UPDATEI() { - m_strm->writeline(plib::pfmt("{1} {2}").e(netlist().time().as_double(),".9").e(static_cast<double>(m_I() - m_I2()))); + m_writer.writeline(plib::pfmt("{1} {2}").e(netlist().time().as_double(),".9").e(static_cast<double>(m_I() - m_I2()))); } NETLIB_RESETI() { } diff --git a/src/lib/netlist/devices/nld_truthtable.cpp b/src/lib/netlist/devices/nld_truthtable.cpp index 67acc61f9ef..52ba817ebc4 100644 --- a/src/lib/netlist/devices/nld_truthtable.cpp +++ b/src/lib/netlist/devices/nld_truthtable.cpp @@ -299,7 +299,7 @@ void tt_factory_create(setup_t &setup, tt_desc &desc, const pstring &sourcefile) } ret->m_desc = desc.desc; if (desc.family != "") - ret->m_family = setup.netlist().family_from_model(desc.family); + ret->m_family = setup.family_from_model(desc.family); setup.factory().register_device(std::unique_ptr<netlist_base_factory_truthtable_t>(ret)); } diff --git a/src/lib/netlist/devices/nld_truthtable.h b/src/lib/netlist/devices/nld_truthtable.h index 117a59ed9fa..827cb26c9d7 100644 --- a/src/lib/netlist/devices/nld_truthtable.h +++ b/src/lib/netlist/devices/nld_truthtable.h @@ -26,7 +26,7 @@ : nld_truthtable_t<nIN, nOUT>(owner, name, family_TTL(), &m_ttbl, m_desc) { } \ private: \ static truthtable_t m_ttbl; \ - static const char *m_desc[]; \ + static const pstring m_desc[]; \ } @@ -159,16 +159,16 @@ namespace netlist template <class C> nld_truthtable_t(C &owner, const pstring &name, const logic_family_desc_t *fam, - truthtable_t *ttp, const char *desc[]) + truthtable_t *ttp, const pstring *desc) : device_t(owner, name) , m_fam(*this, fam) , m_ign(*this, "m_ign", 0) , m_active(*this, "m_active", 1) , m_ttp(ttp) { - while (*desc != nullptr && **desc != 0 ) + while (*desc != "" ) { - m_desc.push_back(pstring(*desc, pstring::UTF8)); + m_desc.push_back(*desc); desc++; } init(); diff --git a/src/lib/netlist/devices/nlid_proxy.cpp b/src/lib/netlist/devices/nlid_proxy.cpp index 8a2ef4860d9..3edb25f73e2 100644 --- a/src/lib/netlist/devices/nlid_proxy.cpp +++ b/src/lib/netlist/devices/nlid_proxy.cpp @@ -100,7 +100,7 @@ namespace netlist , m_last_state(*this, "m_last_var", -1) , m_is_timestep(false) { - const char *power_syms[3][2] ={ {"VCC", "VEE"}, {"VCC", "GND"}, {"VDD", "VSS"}}; + const pstring power_syms[3][2] ={ {"VCC", "VEE"}, {"VCC", "GND"}, {"VDD", "VSS"}}; //register_sub(m_RV); //register_term("1", m_RV.m_P); //register_term("2", m_RV.m_N); @@ -112,9 +112,9 @@ namespace netlist for (int i = 0; i < 3; i++) { pstring devname = out_proxied->device().name(); - auto tp = netlist().setup().find_terminal(devname + "." + pstring(power_syms[i][0], pstring::UTF8), + auto tp = netlist().setup().find_terminal(devname + "." + power_syms[i][0], detail::device_object_t::type_t::INPUT, false); - auto tn = netlist().setup().find_terminal(devname + "." + pstring(power_syms[i][1], pstring::UTF8), + auto tn = netlist().setup().find_terminal(devname + "." + power_syms[i][1], detail::device_object_t::type_t::INPUT, false); if (tp != nullptr && tn != nullptr) { diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h index a81d0dd4240..f2d893c7d28 100644 --- a/src/lib/netlist/devices/nlid_system.h +++ b/src/lib/netlist/devices/nlid_system.h @@ -181,7 +181,7 @@ namespace netlist /* make sure we get the family first */ , m_FAMILY(*this, "FAMILY", "FAMILY(TYPE=TTL)") { - set_logic_family(netlist().family_from_model(m_FAMILY())); + set_logic_family(setup().family_from_model(m_FAMILY())); } NETLIB_UPDATE_AFTER_PARAM_CHANGE() diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 3f24eaaf50c..93c22a9a67f 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -135,24 +135,6 @@ const logic_family_desc_t *family_CD4XXX() return &obj; } -class logic_family_std_proxy_t : public logic_family_desc_t -{ -public: - logic_family_std_proxy_t() { } - virtual plib::owned_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_t &anetlist, - const pstring &name, logic_output_t *proxied) const override; - virtual plib::owned_ptr<devices::nld_base_a_to_d_proxy> create_a_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *proxied) const override; -}; - -plib::owned_ptr<devices::nld_base_d_to_a_proxy> logic_family_std_proxy_t::create_d_a_proxy(netlist_t &anetlist, - const pstring &name, logic_output_t *proxied) const -{ - return plib::owned_ptr<devices::nld_base_d_to_a_proxy>::Create<devices::nld_d_to_a_proxy>(anetlist, name, proxied); -} -plib::owned_ptr<devices::nld_base_a_to_d_proxy> logic_family_std_proxy_t::create_a_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *proxied) const -{ - return plib::owned_ptr<devices::nld_base_a_to_d_proxy>::Create<devices::nld_a_to_d_proxy>(anetlist, name, proxied); -} // ---------------------------------------------------------------------------------------- // queue_t @@ -315,36 +297,6 @@ void netlist_t::remove_dev(core_device_t *dev) ); } -const logic_family_desc_t *netlist_t::family_from_model(const pstring &model) -{ - model_map_t map; - setup().model_parse(model, map); - - if (setup().model_value_str(map, "TYPE") == "TTL") - return family_TTL(); - if (setup().model_value_str(map, "TYPE") == "CD4XXX") - return family_CD4XXX(); - - for (auto & e : m_family_cache) - if (e.first == model) - return e.second.get(); - - auto ret = plib::make_unique_base<logic_family_desc_t, logic_family_std_proxy_t>(); - - ret->m_fixed_V = setup().model_value(map, "FV"); - ret->m_low_thresh_PCNT = setup().model_value(map, "IVL"); - ret->m_high_thresh_PCNT = setup().model_value(map, "IVH"); - ret->m_low_VO = setup().model_value(map, "OVL"); - ret->m_high_VO = setup().model_value(map, "OVH"); - ret->m_R_low = setup().model_value(map, "ORL"); - ret->m_R_high = setup().model_value(map, "ORH"); - - auto retp = ret.get(); - - m_family_cache.emplace_back(model, std::move(ret)); - - return retp; -} void netlist_t::start() @@ -600,7 +552,7 @@ void netlist_t::print_stats() const } } -core_device_t *netlist_t::pget_single_device(const char *classname, bool (*cc)(core_device_t *)) +core_device_t *netlist_t::pget_single_device(const pstring classname, bool (*cc)(core_device_t *)) { core_device_t *ret = nullptr; for (auto &d : m_devices) @@ -728,7 +680,7 @@ void device_t::connect_post_start(detail::core_terminal_t &t1, detail::core_term detail::family_setter_t::family_setter_t(core_device_t &dev, const pstring desc) { - dev.set_logic_family(dev.netlist().family_from_model(desc)); + dev.set_logic_family(dev.netlist().setup().family_from_model(desc)); } detail::family_setter_t::family_setter_t(core_device_t &dev, const logic_family_desc_t *desc) diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index f06873f445a..bb2dcb375e2 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -1239,7 +1239,6 @@ namespace netlist void remove_dev(core_device_t *dev); detail::net_t *find_net(const pstring &name); - const logic_family_desc_t *family_from_model(const pstring &model); template<class device_class> std::vector<device_class *> get_device_list() @@ -1261,7 +1260,7 @@ namespace netlist } template<class C> - C *get_single_device(const char *classname) + C *get_single_device(const pstring classname) { return dynamic_cast<C *>(pget_single_device(classname, check_class<C>)); } @@ -1289,15 +1288,18 @@ namespace netlist plib::dynlib &lib() { return *m_lib; } + // FIXME: find something better /* sole use is to manage lifetime of net objects */ std::vector<plib::owned_ptr<detail::net_t>> m_nets; + /* sole use is to manage lifetime of family objects */ + std::vector<std::pair<pstring, std::unique_ptr<logic_family_desc_t>>> m_family_cache; protected: void print_stats() const; private: - core_device_t *pget_single_device(const char *classname, bool (*cc)(core_device_t *)); + core_device_t *pget_single_device(const pstring classname, bool (*cc)(core_device_t *)); /* mostly rw */ netlist_time m_time; @@ -1323,8 +1325,6 @@ namespace netlist nperfcount_t m_perf_inp_active; std::vector<plib::owned_ptr<core_device_t>> m_devices; - /* sole use is to manage lifetime of family objects */ - std::vector<std::pair<pstring, std::unique_ptr<logic_family_desc_t>>> m_family_cache; }; // ----------------------------------------------------------------------------- diff --git a/src/lib/netlist/nl_parser.cpp b/src/lib/netlist/nl_parser.cpp index 5f0bcaa395d..124c4d5cd50 100644 --- a/src/lib/netlist/nl_parser.cpp +++ b/src/lib/netlist/nl_parser.cpp @@ -29,7 +29,6 @@ bool parser_t::parse(const pstring nlname) { set_identifier_chars("abcdefghijklmnopqrstuvwvxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890_.-"); set_number_chars(".0123456789", "0123456789eE-."); //FIXME: processing of numbers - //const char ws[5] = { ' ', 9, 10, 13, 0 }; set_whitespace(pstring("").cat(' ').cat(9).cat(10).cat(13)); set_comment("/*", "*/", "//"); m_tok_param_left = register_token("("); @@ -60,7 +59,6 @@ bool parser_t::parse(const pstring nlname) while (true) { token_t token = get_token(); - if (token.is_type(ENDOFFILE)) { return false; diff --git a/src/lib/netlist/nl_parser.h b/src/lib/netlist/nl_parser.h index c767ba65306..8c852eb3645 100644 --- a/src/lib/netlist/nl_parser.h +++ b/src/lib/netlist/nl_parser.h @@ -17,8 +17,8 @@ namespace netlist { P_PREVENT_COPYING(parser_t) public: - parser_t(plib::pistream &strm, setup_t &setup) - : plib::ptokenizer(strm), m_setup(setup), m_buf(nullptr) {} + parser_t(plib::putf8_reader &strm, setup_t &setup) + : plib::ptokenizer(strm), m_setup(setup) {} bool parse(const pstring nlname = ""); @@ -70,8 +70,6 @@ namespace netlist token_id_t m_tok_TT_FAMILY; setup_t &m_setup; - - const char *m_buf; }; } diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index 382ee545500..46f6a92aed1 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -902,6 +902,57 @@ nl_double setup_t::model_value(model_map_t &map, const pstring &entity) return tmp.as_double() * factor; } +class logic_family_std_proxy_t : public logic_family_desc_t +{ +public: + logic_family_std_proxy_t() { } + virtual plib::owned_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_t &anetlist, + const pstring &name, logic_output_t *proxied) const override; + virtual plib::owned_ptr<devices::nld_base_a_to_d_proxy> create_a_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *proxied) const override; +}; + +plib::owned_ptr<devices::nld_base_d_to_a_proxy> logic_family_std_proxy_t::create_d_a_proxy(netlist_t &anetlist, + const pstring &name, logic_output_t *proxied) const +{ + return plib::owned_ptr<devices::nld_base_d_to_a_proxy>::Create<devices::nld_d_to_a_proxy>(anetlist, name, proxied); +} +plib::owned_ptr<devices::nld_base_a_to_d_proxy> logic_family_std_proxy_t::create_a_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *proxied) const +{ + return plib::owned_ptr<devices::nld_base_a_to_d_proxy>::Create<devices::nld_a_to_d_proxy>(anetlist, name, proxied); +} + + +const logic_family_desc_t *setup_t::family_from_model(const pstring &model) +{ + model_map_t map; + model_parse(model, map); + + if (model_value_str(map, "TYPE") == "TTL") + return family_TTL(); + if (model_value_str(map, "TYPE") == "CD4XXX") + return family_CD4XXX(); + + for (auto & e : netlist().m_family_cache) + if (e.first == model) + return e.second.get(); + + auto ret = plib::make_unique_base<logic_family_desc_t, logic_family_std_proxy_t>(); + + ret->m_fixed_V = model_value(map, "FV"); + ret->m_low_thresh_PCNT = model_value(map, "IVL"); + ret->m_high_thresh_PCNT = model_value(map, "IVH"); + ret->m_low_VO = model_value(map, "OVL"); + ret->m_high_VO = model_value(map, "OVH"); + ret->m_R_low = model_value(map, "ORL"); + ret->m_R_high = model_value(map, "ORH"); + + auto retp = ret.get(); + + netlist().m_family_cache.emplace_back(model, std::move(ret)); + + return retp; +} + void setup_t::tt_factory_create(tt_desc &desc, const pstring &sourcefile) { devices::tt_factory_create(*this, desc, sourcefile); @@ -938,12 +989,16 @@ std::unique_ptr<plib::pistream> setup_t::get_data_stream(const pstring name) } -bool setup_t::parse_stream(plib::pistream &istrm, const pstring &name) +bool setup_t::parse_stream(plib::putf8_reader &istrm, const pstring &name) { plib::pomemstream ostrm; + plib::putf8_writer owrt(ostrm); + + plib::ppreprocessor(&m_defines).process(istrm, owrt); - plib::pimemstream istrm2(plib::ppreprocessor(&m_defines).process(istrm, ostrm)); - return parser_t(istrm2, *this).parse(name); + plib::pimemstream istrm2(ostrm); + plib::putf8_reader reader2(istrm2); + return parser_t(reader2, *this).parse(name); } void setup_t::register_define(pstring defstr) @@ -964,7 +1019,11 @@ bool source_t::parse(const pstring &name) if (m_type != SOURCE) return false; else - return m_setup.parse_stream(*stream(name), name); + { + auto rstream = stream(name); + plib::putf8_reader reader(*rstream); + return m_setup.parse_stream(reader, name); + } } std::unique_ptr<plib::pistream> source_string_t::stream(const pstring &name) diff --git a/src/lib/netlist/nl_setup.h b/src/lib/netlist/nl_setup.h index 256b9ab21b3..06f70623ada 100644 --- a/src/lib/netlist/nl_setup.h +++ b/src/lib/netlist/nl_setup.h @@ -244,7 +244,7 @@ namespace netlist std::unique_ptr<plib::pistream> get_data_stream(const pstring name); - bool parse_stream(plib::pistream &istrm, const pstring &name); + bool parse_stream(plib::putf8_reader &istrm, const pstring &name); /* register a source */ @@ -266,6 +266,8 @@ namespace netlist void model_parse(const pstring &model, model_map_t &map); + const logic_family_desc_t *family_from_model(const pstring &model); + /* FIXME: truth table trampoline */ void tt_factory_create(tt_desc &desc, const pstring &sourcefile); diff --git a/src/lib/netlist/plib/pconfig.h b/src/lib/netlist/plib/pconfig.h index f2164bbde7f..9cd917ceb28 100644 --- a/src/lib/netlist/plib/pconfig.h +++ b/src/lib/netlist/plib/pconfig.h @@ -56,6 +56,7 @@ typedef __int128_t INT128; #define P_PREVENT_COPYING(name) \ private: \ name(const name &); \ + name(const name &&); \ name &operator=(const name &); //============================================================ diff --git a/src/lib/netlist/plib/pfmtlog.cpp b/src/lib/netlist/plib/pfmtlog.cpp index 48b0f1544c1..4cd74837dbb 100644 --- a/src/lib/netlist/plib/pfmtlog.cpp +++ b/src/lib/netlist/plib/pfmtlog.cpp @@ -22,7 +22,7 @@ plog_dispatch_intf::~plog_dispatch_intf() { } -pfmt::pfmt(const pstring &fmt) +pfmt::pfmt(const pstring fmt) : m_str(m_str_buf), m_allocated(0), m_arg(0) { std::size_t l = fmt.blen() + 1; @@ -34,18 +34,6 @@ pfmt::pfmt(const pstring &fmt) memcpy(m_str, fmt.c_str(), l); } -pfmt::pfmt(const char *fmt) -: m_str(m_str_buf), m_allocated(0), m_arg(0) -{ - std::size_t l = strlen(fmt) + 1; - if (l>sizeof(m_str_buf)) - { - m_allocated = 2 * l; - m_str = palloc_array<char>(2 * l); - } - memcpy(m_str, fmt, l); -} - pfmt::~pfmt() { if (m_allocated > 0) diff --git a/src/lib/netlist/plib/pfmtlog.h b/src/lib/netlist/plib/pfmtlog.h index 0aeb015dc2c..fbae59673d7 100644 --- a/src/lib/netlist/plib/pfmtlog.h +++ b/src/lib/netlist/plib/pfmtlog.h @@ -157,13 +157,12 @@ protected: class pfmt : public pformat_base<pfmt> { public: - explicit pfmt(const pstring &fmt); - explicit pfmt(const char *fmt); + explicit pfmt(const pstring fmt); virtual ~pfmt(); operator pstring() const { return pstring(m_str, pstring::UTF8); } - const char *cstr() { return m_str; } + const char *c_str() { return m_str; } protected: @@ -190,41 +189,42 @@ class plog_dispatch_intf; template <bool build_enabled = true> class pfmt_writer_t { + P_PREVENT_COPYING(pfmt_writer_t) public: - pfmt_writer_t() : m_enabled(true) { } + explicit pfmt_writer_t() : m_enabled(true) { } virtual ~pfmt_writer_t() { } - void operator ()(const char *fmt) const + void operator ()(const pstring fmt) const { - if (build_enabled && m_enabled) vdowrite(pstring(fmt, pstring::UTF8)); + if (build_enabled && m_enabled) vdowrite(fmt); } template<typename T1> - void operator ()(const char *fmt, const T1 &v1) const + void operator ()(const pstring fmt, const T1 &v1) const { if (build_enabled && m_enabled) vdowrite(pfmt(fmt)(v1)); } template<typename T1, typename T2> - void operator ()(const char *fmt, const T1 &v1, const T2 &v2) const + void operator ()(const pstring fmt, const T1 &v1, const T2 &v2) const { if (build_enabled && m_enabled) vdowrite(pfmt(fmt)(v1)(v2)); } template<typename T1, typename T2, typename T3> - void operator ()(const char *fmt, const T1 &v1, const T2 &v2, const T3 &v3) const + void operator ()(const pstring fmt, const T1 &v1, const T2 &v2, const T3 &v3) const { if (build_enabled && m_enabled) vdowrite(pfmt(fmt)(v1)(v2)(v3)); } template<typename T1, typename T2, typename T3, typename T4> - void operator ()(const char *fmt, const T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4) const + void operator ()(const pstring fmt, const T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4) const { if (build_enabled && m_enabled) vdowrite(pfmt(fmt)(v1)(v2)(v3)(v4)); } template<typename T1, typename T2, typename T3, typename T4, typename T5> - void operator ()(const char *fmt, const T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4, const T5 &v5) const + void operator ()(const pstring fmt, const T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4, const T5 &v5) const { if (build_enabled && m_enabled) vdowrite(pfmt(fmt)(v1)(v2)(v3)(v4)(v5)); } @@ -248,7 +248,7 @@ template <plog_level::e L, bool build_enabled = true> class plog_channel : public pfmt_writer_t<build_enabled> { public: - explicit plog_channel(plog_dispatch_intf *b) : pfmt_writer_t<build_enabled>(), m_base(b) { } + explicit plog_channel(plog_dispatch_intf *b) : pfmt_writer_t<build_enabled>(), m_base(b) { } virtual ~plog_channel() { } protected: diff --git a/src/lib/netlist/plib/pparser.cpp b/src/lib/netlist/plib/pparser.cpp index 35629aacdee..9d25adffcbe 100644 --- a/src/lib/netlist/plib/pparser.cpp +++ b/src/lib/netlist/plib/pparser.cpp @@ -15,7 +15,7 @@ namespace plib { // A simple tokenizer // ---------------------------------------------------------------------------------------- -ptokenizer::ptokenizer(pistream &strm) +ptokenizer::ptokenizer(plib::putf8_reader &strm) : m_strm(strm), m_lineno(0), m_cur_line(""), m_px(m_cur_line.begin()), m_unget(0), m_string('"') { } @@ -483,7 +483,7 @@ pstring ppreprocessor::process_line(const pstring &line) } -postream & ppreprocessor::process_i(pistream &istrm, postream &ostrm) +void ppreprocessor::process(putf8_reader &istrm, putf8_writer &ostrm) { pstring line; while (istrm.readline(line)) @@ -491,7 +491,6 @@ postream & ppreprocessor::process_i(pistream &istrm, postream &ostrm) line = process_line(line); ostrm.writeline(line); } - return ostrm; } } diff --git a/src/lib/netlist/plib/pparser.h b/src/lib/netlist/plib/pparser.h index db88299d85c..5bda079cc63 100644 --- a/src/lib/netlist/plib/pparser.h +++ b/src/lib/netlist/plib/pparser.h @@ -22,7 +22,7 @@ class ptokenizer { P_PREVENT_COPYING(ptokenizer) public: - explicit ptokenizer(pistream &strm); + explicit ptokenizer(plib::putf8_reader &strm); virtual ~ptokenizer(); @@ -126,7 +126,7 @@ private: bool eof() { return m_strm.eof(); } - pistream &m_strm; + putf8_reader &m_strm; int m_lineno; pstring m_cur_line; @@ -165,22 +165,12 @@ public: ppreprocessor(std::vector<define_t> *defines = nullptr); virtual ~ppreprocessor() {} - template<class ISTR, class OSTR> - OSTR &process(ISTR &istrm, OSTR &ostrm) - { - return dynamic_cast<OSTR &>(process_i(istrm, ostrm)); - } + void process(putf8_reader &istrm, putf8_writer &ostrm); protected: - - postream &process_i(pistream &istrm, postream &ostrm); - double expr(const plib::pstring_vector_t &sexpr, std::size_t &start, int prio); - define_t *get_define(const pstring &name); - pstring replace_macros(const pstring &line); - virtual void error(const pstring &err); private: @@ -190,7 +180,7 @@ private: std::unordered_map<pstring, define_t> m_defines; plib::pstring_vector_t m_expr_sep; - std::uint_least32_t m_ifflag; // 31 if levels + std::uint_least64_t m_ifflag; // 31 if levels int m_level; int m_lineno; }; diff --git a/src/lib/netlist/plib/pstream.cpp b/src/lib/netlist/plib/pstream.cpp index b05d86d7bc5..efbf2aa2374 100644 --- a/src/lib/netlist/plib/pstream.cpp +++ b/src/lib/netlist/plib/pstream.cpp @@ -27,28 +27,6 @@ pistream::~pistream() { } -bool pistream::readline(pstring &line) -{ - char c = 0; - m_linebuf.clear(); - if (!this->readbyte(c)) - { - line = ""; - return false; - } - while (true) - { - if (c == 10) - break; - else if (c != 13) /* ignore CR */ - m_linebuf += c; - if (!this->readbyte(c)) - break; - } - line = m_linebuf; - return true; -} - // ----------------------------------------------------------------------------- // postream: output stream // ----------------------------------------------------------------------------- @@ -367,9 +345,43 @@ pstream::pos_type pomemstream::vtell() return m_pos; } -pstream_fmt_writer_t::~pstream_fmt_writer_t() +bool putf8_reader::readline(pstring &line) { + pstring::code_t c = 0; + m_linebuf.clear(); + if (!this->readcode(c)) + { + line = ""; + return false; + } + while (true) + { + if (c == 10) + break; + else if (c != 13) /* ignore CR */ + m_linebuf += pstring(c); + if (!this->readcode(c)) + break; + } + line = m_linebuf; + return true; } +putf8_fmt_writer::putf8_fmt_writer(postream &strm) +: pfmt_writer_t() +, putf8_writer(strm) +{ +} + +putf8_fmt_writer::~putf8_fmt_writer() +{ +} + +void putf8_fmt_writer::vdowrite(const pstring &ls) const +{ + write(ls); +} + + } diff --git a/src/lib/netlist/plib/pstream.h b/src/lib/netlist/plib/pstream.h index 6d02c4d1551..b7584a49663 100644 --- a/src/lib/netlist/plib/pstream.h +++ b/src/lib/netlist/plib/pstream.h @@ -81,15 +81,6 @@ public: bool eof() const { return ((flags() & FLAG_EOF) != 0); } - /* this digests linux & dos/windows text files */ - - bool readline(pstring &line); - - bool readbyte(char &b) - { - return (read(&b, 1) == 1); - } - pos_type read(void *buf, const unsigned n) { return vread(buf, n); @@ -99,8 +90,6 @@ protected: /* read up to n bytes from stream */ virtual pos_type vread(void *buf, const pos_type n) = 0; -private: - pstringbuffer m_linebuf; }; // ----------------------------------------------------------------------------- @@ -115,24 +104,6 @@ public: explicit postream(unsigned flags) : pstream(flags) {} virtual ~postream(); - /* this digests linux & dos/windows text files */ - - void writeline(const pstring &line) - { - write(line); - write(10); - } - - void write(const pstring &text) - { - write(text.c_str(), text.blen()); - } - - void write(const char c) - { - write(&c, 1); - } - void write(const void *buf, const pos_type n) { vwrite(buf, n); @@ -306,6 +277,7 @@ public: explicit pimemstream(const pomemstream &ostrm); virtual ~pimemstream(); + pos_type size() const { return m_len; } protected: /* read up to n bytes from stream */ virtual pos_type vread(void *buf, const pos_type n) override; @@ -335,27 +307,89 @@ private: }; // ----------------------------------------------------------------------------- -// pstream_fmt_writer_t: writer on top of ostream +// putf8reader_t: reader on top of istream // ----------------------------------------------------------------------------- -class pstream_fmt_writer_t : public plib::pfmt_writer_t<> +/* this digests linux & dos/windows text files */ + +class putf8_reader { - P_PREVENT_COPYING(pstream_fmt_writer_t) + P_PREVENT_COPYING(putf8_reader) public: + explicit putf8_reader(pistream &strm) : m_strm(strm) {} + virtual ~putf8_reader() {} - explicit pstream_fmt_writer_t(postream &strm) : m_strm(strm) {} - virtual ~pstream_fmt_writer_t(); + bool eof() const { return m_strm.eof(); } + bool readline(pstring &line); -protected: - virtual void vdowrite(const pstring &ls) const override + bool readbyte1(char &b) + { + return (m_strm.read(&b, 1) == 1); + } + + bool readcode(pstring::code_t &c) + { + char b[4]; + if (m_strm.read(&b[0], 1) != 1) + return false; + const unsigned l = pstring::traits::codelen(b); + for (unsigned i = 1; i < l; i++) + if (m_strm.read(&b[i], 1) != 1) + return false; + c = pstring::traits::code(b); + return true; + } + +private: + pistream &m_strm; + pstringbuffer m_linebuf; +}; + +// ----------------------------------------------------------------------------- +// putf8writer_t: writer on top of ostream +// ----------------------------------------------------------------------------- + +class putf8_writer +{ + P_PREVENT_COPYING(putf8_writer) +public: + explicit putf8_writer(postream &strm) : m_strm(strm) {} + virtual ~putf8_writer() {} + + void writeline(const pstring &line) const + { + write(line); + write(10); + } + + void write(const pstring &text) const { - m_strm.write(ls); + m_strm.write(text.c_str(), text.blen()); + } + + void write(const pstring::code_t c) const + { + write(pstring(c)); } private: postream &m_strm; }; +class putf8_fmt_writer : public pfmt_writer_t<>, public putf8_writer +{ + P_PREVENT_COPYING(putf8_fmt_writer) +public: + + explicit putf8_fmt_writer(postream &strm); + virtual ~putf8_fmt_writer(); + +protected: + virtual void vdowrite(const pstring &ls) const override; + +private: +}; + } #endif /* PSTREAM_H_ */ diff --git a/src/lib/netlist/plib/pstring.cpp b/src/lib/netlist/plib/pstring.cpp index 2325e8b08c2..7d676f34c0d 100644 --- a/src/lib/netlist/plib/pstring.cpp +++ b/src/lib/netlist/plib/pstring.cpp @@ -426,7 +426,6 @@ void pstring_t<F>::sfree(pstr_t *s) } else plib::pfree_array(reinterpret_cast<char *>(s)); - //_mm_free(((char *)s)); } } @@ -477,7 +476,6 @@ void pstring_t<F>::sfree(pstr_t *s) if (s->m_ref_count == 0 && s != &m_zero) { plib::pfree_array(((char *)s)); - //_mm_free(((char *)s)); } } diff --git a/src/lib/netlist/plib/pstring.h b/src/lib/netlist/plib/pstring.h index ae255d4a6cd..999bd10ce6b 100644 --- a/src/lib/netlist/plib/pstring.h +++ b/src/lib/netlist/plib/pstring.h @@ -81,6 +81,7 @@ public: pstring_t(const pstring_t &string) : m_ptr(&m_zero) { init(string); } pstring_t(pstring_t &&string) : m_ptr(string.m_ptr) { string.m_ptr = nullptr; } + explicit pstring_t(code_t code) : m_ptr(&m_zero) { pstring_t t; t+= code; init(t); } // assignment operators pstring_t &operator=(const pstring_t &string) { pcopy(string); return *this; } diff --git a/src/lib/netlist/prg/nltool.cpp b/src/lib/netlist/prg/nltool.cpp index f039cf44ac4..a6513f260b9 100644 --- a/src/lib/netlist/prg/nltool.cpp +++ b/src/lib/netlist/prg/nltool.cpp @@ -77,8 +77,8 @@ public: static plib::pstdout pout_strm; static plib::pstderr perr_strm; -static plib::pstream_fmt_writer_t pout(pout_strm); -static plib::pstream_fmt_writer_t perr(perr_strm); +static plib::putf8_fmt_writer pout(pout_strm); +static plib::putf8_fmt_writer perr(perr_strm); static NETLIST_START(dummy) /* Standard stuff */ @@ -244,8 +244,9 @@ static std::vector<input_t> read_input(const netlist::setup_t &setup, pstring fn if (fname != "") { plib::pifilestream f(fname); + plib::putf8_reader r(f); pstring l; - while (f.readline(l)) + while (r.readline(l)) { if (l != "") { @@ -492,7 +493,7 @@ static void listdevices(tool_options_t &opts) -------------------------------------------------*/ #if 0 -static const char *pmf_verbose[] = +static const pstring pmf_verbose[] = { "NL_PMF_TYPE_VIRTUAL", "NL_PMF_TYPE_GNUC_PMF", @@ -585,7 +586,7 @@ int main(int argc, char *argv[]) result = c.result(); } /* present result */ - pout_strm.write(result); + pout.write(result); } else { diff --git a/src/lib/netlist/prg/nlwav.cpp b/src/lib/netlist/prg/nlwav.cpp index 44adf2b3508..5a3fdbbfad0 100644 --- a/src/lib/netlist/prg/nlwav.cpp +++ b/src/lib/netlist/prg/nlwav.cpp @@ -35,8 +35,8 @@ plib::pstdin pin_strm; plib::pstdout pout_strm; plib::pstderr perr_strm; -plib::pstream_fmt_writer_t pout(pout_strm); -plib::pstream_fmt_writer_t perr(perr_strm); +plib::putf8_fmt_writer pout(pout_strm); +plib::putf8_fmt_writer perr(perr_strm); nlwav_options_t opts; @@ -145,6 +145,7 @@ static void convert() { plib::postream *fo = (opts.opt_out() == "-" ? &pout_strm : new plib::pofilestream(opts.opt_out())); plib::pistream *fin = (opts.opt_inp() == "-" ? &pin_strm : new plib::pifilestream(opts.opt_inp())); + plib::putf8_reader reader(*fin); wav_t *wo = new wav_t(*fo, 48000); double dt = 1.0 / static_cast<double>(wo->sample_rate()); @@ -162,7 +163,7 @@ static void convert() //short sample = 0; pstring line; - while(fin->readline(line)) + while(reader.readline(line)) { #if 1 double t = 0.0; double v = 0.0; @@ -227,7 +228,7 @@ static void convert() } } -static void usage(plib::pstream_fmt_writer_t &fw) +static void usage(plib::putf8_fmt_writer &fw) { fw("{}\n", opts.help("Convert netlist log files into wav files.\n", "nltool [options]").c_str()); diff --git a/src/lib/netlist/solver/nld_matrix_solver.h b/src/lib/netlist/solver/nld_matrix_solver.h index fb3b044ee47..fc7ab7fcbdb 100644 --- a/src/lib/netlist/solver/nld_matrix_solver.h +++ b/src/lib/netlist/solver/nld_matrix_solver.h @@ -135,7 +135,7 @@ public: virtual void log_stats(); - virtual void create_solver_code(plib::postream &strm) + virtual void create_solver_code(plib::putf8_fmt_writer &strm) { strm.writeline(plib::pfmt("/* {1} doesn't support static compile */")); } diff --git a/src/lib/netlist/solver/nld_ms_gcr.h b/src/lib/netlist/solver/nld_ms_gcr.h index 80a68604a56..853cc34d39c 100644 --- a/src/lib/netlist/solver/nld_ms_gcr.h +++ b/src/lib/netlist/solver/nld_ms_gcr.h @@ -52,18 +52,19 @@ public: virtual void vsetup(analog_net_t::list_t &nets) override; virtual unsigned vsolve_non_dynamic(const bool newton_raphson) override; - virtual void create_solver_code(plib::postream &strm) override; + virtual void create_solver_code(plib::putf8_fmt_writer &strm) override; private: - void csc_private(plib::postream &strm); + void csc_private(plib::putf8_fmt_writer &strm); using extsolver = void (*)(double * RESTRICT m_A, double * RESTRICT RHS); pstring static_compile_name() { plib::postringstream t; - csc_private(t); + plib::putf8_fmt_writer w(t); + csc_private(w); std::hash<pstring> h; return plib::pfmt("nl_gcr_{1:x}_{2}")(h( t.str() ))(mat.nz_num); @@ -185,7 +186,7 @@ void matrix_solver_GCR_t<m_N, storage_N>::vsetup(analog_net_t::list_t &nets) } template <unsigned m_N, unsigned storage_N> -void matrix_solver_GCR_t<m_N, storage_N>::csc_private(plib::postream &strm) +void matrix_solver_GCR_t<m_N, storage_N>::csc_private(plib::putf8_fmt_writer &strm) { const unsigned iN = N(); for (unsigned i = 0; i < iN - 1; i++) @@ -197,7 +198,7 @@ void matrix_solver_GCR_t<m_N, storage_N>::csc_private(plib::postream &strm) unsigned pi = mat.diag[i]; //const nl_double f = 1.0 / m_A[pi++]; - strm.writeline(plib::pfmt("const double f{1} = 1.0 / m_A[{2}];")(i)(pi)); + strm("const double f{1} = 1.0 / m_A[{2}];", i,pi); pi++; const unsigned piie = mat.ia[i+1]; @@ -210,7 +211,7 @@ void matrix_solver_GCR_t<m_N, storage_N>::csc_private(plib::postream &strm) pj++; //const nl_double f1 = - m_A[pj++] * f; - strm.writeline(plib::pfmt("\tconst double f{1}_{2} = -f{3} * m_A[{4}];")(i)(j)(i)(pj)); + strm("\tconst double f{1}_{2} = -f{3} * m_A[{4}];", i, j, i, pj); pj++; // subtract row i from j */ @@ -219,18 +220,18 @@ void matrix_solver_GCR_t<m_N, storage_N>::csc_private(plib::postream &strm) while (mat.ja[pj] < mat.ja[pii]) pj++; //m_A[pj++] += m_A[pii++] * f1; - strm.writeline(plib::pfmt("\tm_A[{1}] += m_A[{2}] * f{3}_{4};")(pj)(pii)(i)(j)); + strm("\tm_A[{1}] += m_A[{2}] * f{3}_{4};", pj, pii, i, j); pj++; pii++; } //RHS[j] += f1 * RHS[i]; - strm.writeline(plib::pfmt("\tRHS[{1}] += f{2}_{3} * RHS[{4}];")(j)(i)(j)(i)); + strm("\tRHS[{1}] += f{2}_{3} * RHS[{4}];", j, i, j, i); } } } } template <unsigned m_N, unsigned storage_N> -void matrix_solver_GCR_t<m_N, storage_N>::create_solver_code(plib::postream &strm) +void matrix_solver_GCR_t<m_N, storage_N>::create_solver_code(plib::putf8_fmt_writer &strm) { //const unsigned iN = N(); diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp index 12297dbd237..629c7c0173e 100644 --- a/src/lib/netlist/solver/nld_solver.cpp +++ b/src/lib/netlist/solver/nld_solver.cpp @@ -398,8 +398,9 @@ void NETLIB_NAME(solver)::post_start() void NETLIB_NAME(solver)::create_solver_code(plib::postream &strm) { + plib::putf8_fmt_writer w(strm); for (auto & s : m_mat_solvers) - s->create_solver_code(strm); + s->create_solver_code(w); } NETLIB_DEVICE_IMPL(solver) diff --git a/src/lib/netlist/tools/nl_convert.cpp b/src/lib/netlist/tools/nl_convert.cpp index 9ab0384c0e7..59450335926 100644 --- a/src/lib/netlist/tools/nl_convert.cpp +++ b/src/lib/netlist/tools/nl_convert.cpp @@ -18,7 +18,7 @@ * define a model param on core device */ /* Format: external name,netlist device,model */ -static const char *s_lib_map = +static const pstring s_lib_map = "SN74LS00D, TTL_7400_DIP, 74LSXX\n" "SN74LS04D, TTL_7404_DIP, 74LSXX\n" "SN74ALS08D, TTL_7408_DIP, 74ALSXX\n" @@ -44,9 +44,10 @@ using lib_map_t = std::unordered_map<pstring, lib_map_entry>; static lib_map_t read_lib_map(const pstring lm) { plib::pistringstream istrm(lm); + plib::putf8_reader reader(istrm); lib_map_t m; pstring line; - while (istrm.readline(line)) + while (reader.readline(line)) { plib::pstring_vector_t split(line, ","); m[split[0].trim()] = { split[1].trim(), split[2].trim() }; @@ -191,7 +192,7 @@ const pstring nl_convert_base_t::get_nl_val(const double val) break; i++; } - return plib::pfmt(m_units[i].m_func)(val / m_units[i].m_mult); + return plib::pfmt(pstring(m_units[i].m_func, pstring::UTF8))(val / m_units[i].m_mult); } } double nl_convert_base_t::get_sp_unit(const pstring &unit) @@ -401,7 +402,7 @@ void nl_convert_spice_t::process_line(const pstring &line) Eagle converter -------------------------------------------------*/ -nl_convert_eagle_t::tokenizer::tokenizer(nl_convert_eagle_t &convert, plib::pistream &strm) +nl_convert_eagle_t::tokenizer::tokenizer(nl_convert_eagle_t &convert, plib::putf8_reader &strm) : plib::ptokenizer(strm) , m_convert(convert) { @@ -429,7 +430,8 @@ void nl_convert_eagle_t::tokenizer::verror(const pstring &msg, int line_num, con void nl_convert_eagle_t::convert(const pstring &contents) { plib::pistringstream istrm(contents); - tokenizer tok(*this, istrm); + plib::putf8_reader reader(istrm); + tokenizer tok(*this, reader); out("NETLIST_START(dummy)\n"); add_term("GND", "GND"); @@ -537,7 +539,7 @@ void nl_convert_eagle_t::convert(const pstring &contents) RINF converter -------------------------------------------------*/ -nl_convert_rinf_t::tokenizer::tokenizer(nl_convert_rinf_t &convert, plib::pistream &strm) +nl_convert_rinf_t::tokenizer::tokenizer(nl_convert_rinf_t &convert, plib::putf8_reader &strm) : plib::ptokenizer(strm) , m_convert(convert) { @@ -577,8 +579,9 @@ void nl_convert_rinf_t::tokenizer::verror(const pstring &msg, int line_num, cons void nl_convert_rinf_t::convert(const pstring &contents) { plib::pistringstream istrm(contents); - tokenizer tok(*this, istrm); - auto lm = read_lib_map(pstring(s_lib_map, pstring::UTF8)); + plib::putf8_reader reader(istrm); + tokenizer tok(*this, reader); + auto lm = read_lib_map(s_lib_map); out("NETLIST_START(dummy)\n"); add_term("GND", "GND"); diff --git a/src/lib/netlist/tools/nl_convert.h b/src/lib/netlist/tools/nl_convert.h index 44ac8dee19e..66aefaea038 100644 --- a/src/lib/netlist/tools/nl_convert.h +++ b/src/lib/netlist/tools/nl_convert.h @@ -49,7 +49,7 @@ protected: double get_sp_val(const pstring &sin); - plib::pstream_fmt_writer_t out; + plib::putf8_fmt_writer out; private: struct net_t @@ -166,7 +166,7 @@ public: class tokenizer : public plib::ptokenizer { public: - tokenizer(nl_convert_eagle_t &convert, plib::pistream &strm); + tokenizer(nl_convert_eagle_t &convert, plib::putf8_reader &strm); token_id_t m_tok_ADD; token_id_t m_tok_VALUE; @@ -202,7 +202,7 @@ public: class tokenizer : public plib::ptokenizer { public: - tokenizer(nl_convert_rinf_t &convert, plib::pistream &strm); + tokenizer(nl_convert_rinf_t &convert, plib::putf8_reader &strm); token_id_t m_tok_HEA; token_id_t m_tok_APP; |