diff --git a/scripts/src/machine.lua b/scripts/src/machine.lua index 37bdb8fe933..7ddf031d76d 100644 --- a/scripts/src/machine.lua +++ b/scripts/src/machine.lua @@ -1176,6 +1176,18 @@ if (MACHINES["LDV1000"]~=null) then } end +--------------------------------------------------- +-- +--@src/devices/machine/ldp1000.h,MACHINES["LDP1000"] = true +--------------------------------------------------- + +if (MACHINES["LDP1000"]~=null) then + files { + MAME_DIR .. "src/devices/machine/ldp1000.cpp", + MAME_DIR .. "src/devices/machine/ldp1000.h", + } +end + --------------------------------------------------- -- --@src/devices/machine/ldvp931.h,MACHINES["LDVP931"] = true diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua index 13f35db892e..1bd63589f68 100644 --- a/scripts/target/mame/arcade.lua +++ b/scripts/target/mame/arcade.lua @@ -429,6 +429,7 @@ MACHINES["LC89510"] = true MACHINES["LDPR8210"] = true MACHINES["LDSTUB"] = true MACHINES["LDV1000"] = true +MACHINES["LDP1000"] = true MACHINES["LDVP931"] = true --MACHINES["LH5810"] = true MACHINES["LINFLASH"] = true diff --git a/src/devices/machine/ldp1000.cpp b/src/devices/machine/ldp1000.cpp new file mode 100644 index 00000000000..922f3c2b63e --- /dev/null +++ b/src/devices/machine/ldp1000.cpp @@ -0,0 +1,120 @@ +// license:BSD-3-Clause +// copyright-holders:Angelo Salese +/*************************************************************************** + + Sony LDP-1000 laserdisc emulation. + + TODO: + - Dump BIOSes (seven of them according to docs) + - Hookup with Sony SMC-70 / SMC-777 + +***************************************************************************/ + +#include "emu.h" +#include "machine/ldp1000.h" + + +ROM_START( ldp1000 ) + ROM_REGION( 0x2000, "ldp1000", 0 ) + ROM_LOAD( "ldp1000_bios.bin", 0x0000, 0x2000, NO_DUMP ) +ROM_END + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +// device type definition +const device_type SONY_LDP1000 = &device_creator; + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// ldp1000_device - constructor +//------------------------------------------------- + +sony_ldp1000_device::sony_ldp1000_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : laserdisc_device(mconfig, SONY_LDP1000, "Sony LDP-1000", tag, owner, clock, "ldp1000", __FILE__) +{ +} + + +//------------------------------------------------- +// device_validity_check - perform validity checks +// on this device +//------------------------------------------------- + +void sony_ldp1000_device::device_validity_check(validity_checker &valid) const +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void sony_ldp1000_device::device_start() +{ + laserdisc_device::device_start(); +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void sony_ldp1000_device::device_reset() +{ + laserdisc_device::device_reset(); + +} + +//------------------------------------------------- +// device_rom_region - return a pointer to our +// ROM region definitions +//------------------------------------------------- + +const rom_entry *sony_ldp1000_device::device_rom_region() const +{ + return ROM_NAME(ldp1000); +} + + +//------------------------------------------------- +// player_vsync - VSYNC callback, called at the +// start of the blanking period +//------------------------------------------------- + +void sony_ldp1000_device::player_vsync(const vbi_metadata &vbi, int fieldnum, const attotime &curtime) +{ + //printf("%d vsync\n",fieldnum); +} + + +//------------------------------------------------- +// player_update - update callback, called on +// the first visible line of the frame +//------------------------------------------------- + +INT32 sony_ldp1000_device::player_update(const vbi_metadata &vbi, int fieldnum, const attotime &curtime) +{ + //printf("%d update\n",fieldnum); + + return fieldnum; +} + + +//************************************************************************** +// READ/WRITE HANDLERS +//************************************************************************** + +READ8_MEMBER( sony_ldp1000_device::read ) +{ + return 0; +} + +WRITE8_MEMBER( sony_ldp1000_device::write ) +{ +} diff --git a/src/devices/machine/ldp1000.h b/src/devices/machine/ldp1000.h new file mode 100644 index 00000000000..ee7acc789bf --- /dev/null +++ b/src/devices/machine/ldp1000.h @@ -0,0 +1,67 @@ +// license:BSD-3-Clause +// copyright-holders:Angelo Salese +/*************************************************************************** + + Sony LDP-1000 laserdisc emulation. + +***************************************************************************/ + +#pragma once + +#ifndef __LDP1000DEV_H__ +#define __LDP1000DEV_H__ + +#include "laserdsc.h" + + +//************************************************************************** +// INTERFACE CONFIGURATION MACROS +//************************************************************************** + +#define MCFG_LASERDISC_LDP1000_ADD(_tag) \ + MCFG_DEVICE_ADD(_tag, SONY_LDP1000, 0) + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// device type definition +extern const device_type SONY_LDP1000; + +// ======================> sony_ldp1000_device + +class sony_ldp1000_device : public laserdisc_device +{ +public: + // construction/destruction + sony_ldp1000_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // I/O operations + DECLARE_WRITE8_MEMBER( write ); + DECLARE_READ8_MEMBER( read ); + +protected: + // device-level overrides + virtual void device_validity_check(validity_checker &valid) const override; + virtual void device_start() override; + virtual void device_reset() override; + virtual const rom_entry *device_rom_region() const override; + + virtual void player_vsync(const vbi_metadata &vbi, int fieldnum, const attotime &curtime) override; + virtual INT32 player_update(const vbi_metadata &vbi, int fieldnum, const attotime &curtime) override; + virtual void player_overlay(bitmap_yuy16 &bitmap) override { } + +}; + + + + + + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + + + +#endif diff --git a/src/devices/machine/netlist.cpp b/src/devices/machine/netlist.cpp index bd65d0b2eef..b193492c5f6 100644 --- a/src/devices/machine/netlist.cpp +++ b/src/devices/machine/netlist.cpp @@ -322,9 +322,9 @@ void netlist_mame_device_t::device_start() m_setup->start_devices(); m_setup->resolve_inputs(); - netlist().save_item(this, m_rem, "m_rem"); - netlist().save_item(this, m_div, "m_div"); - netlist().save_item(this, m_old, "m_old"); + netlist().save(*this, m_rem, "m_rem"); + netlist().save(*this, m_div, "m_div"); + netlist().save(*this, m_old, "m_old"); save_state(); @@ -366,7 +366,7 @@ ATTR_COLD void netlist_mame_device_t::device_post_load() { LOG_DEV_CALLS(("device_post_load\n")); - netlist().post_load(); + netlist().state().post_load(); netlist().rebuild_lists(); } @@ -374,7 +374,7 @@ ATTR_COLD void netlist_mame_device_t::device_pre_save() { LOG_DEV_CALLS(("device_pre_save\n")); - netlist().pre_save(); + netlist().state().pre_save(); } void netlist_mame_device_t::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) @@ -399,53 +399,44 @@ ATTR_HOT ATTR_ALIGN void netlist_mame_device_t::check_mame_abort_slice() ATTR_COLD void netlist_mame_device_t::save_state() { - for (auto const & s : netlist().save_list()) + for (auto const & s : netlist().state().save_list()) { netlist().log().debug("saving state for {1}\n", s->m_name.cstr()); - switch (s->m_dt) + if (s->m_dt.is_float) { - case pstate_data_type_e::DT_DOUBLE: - { - double *td = s->resolved(); - if (td != nullptr) save_pointer(td, s->m_name.cstr(), s->m_count); - } - break; - case pstate_data_type_e::DT_FLOAT: - { - float *td = s->resolved(); - if (td != nullptr) save_pointer(td, s->m_name.cstr(), s->m_count); - } - break; -#if (PHAS_INT128) - case pstate_data_type_e::DT_INT128: - // FIXME: we are cheating here - save_pointer((char *) s->m_ptr, s->m_name.cstr(), s->m_count * sizeof(INT128)); - break; -#endif - case pstate_data_type_e::DT_INT64: - save_pointer((INT64 *) s->m_ptr, s->m_name.cstr(), s->m_count); - break; - case pstate_data_type_e::DT_INT16: - save_pointer((INT16 *) s->m_ptr, s->m_name.cstr(), s->m_count); - break; - case pstate_data_type_e::DT_INT8: - save_pointer((INT8 *) s->m_ptr, s->m_name.cstr(), s->m_count); - break; - case pstate_data_type_e::DT_INT: - save_pointer((int *) s->m_ptr, s->m_name.cstr(), s->m_count); - break; - case pstate_data_type_e::DT_BOOLEAN: - save_pointer((bool *) s->m_ptr, s->m_name.cstr(), s->m_count); - break; - case pstate_data_type_e::DT_CUSTOM: - break; - case pstate_data_type_e::NOT_SUPPORTED: - default: - netlist().log().fatal("found unsupported save element %s\n", s->m_name); - break; + if (s->m_dt.size == sizeof(double)) + { + double *td = s->resolved(); + if (td != nullptr) save_pointer(td, s->m_name.cstr(), s->m_count); + } + else if (s->m_dt.size == sizeof(float)) + { + float *td = s->resolved(); + if (td != nullptr) save_pointer(td, s->m_name.cstr(), s->m_count); + } + else + netlist().log().fatal("Unknown floating type for {1}\n", s->m_name.cstr()); } + else if (s->m_dt.is_integral) + { + if (s->m_dt.size == sizeof(INT64)) + save_pointer((INT64 *) s->m_ptr, s->m_name.cstr(), s->m_count); + else if (s->m_dt.size == sizeof(INT32)) + save_pointer((INT32 *) s->m_ptr, s->m_name.cstr(), s->m_count); + else if (s->m_dt.size == sizeof(INT16)) + save_pointer((INT16 *) s->m_ptr, s->m_name.cstr(), s->m_count); + else if (s->m_dt.size == sizeof(INT8)) + save_pointer((INT8 *) s->m_ptr, s->m_name.cstr(), s->m_count); + else + netlist().log().fatal("Unknown integral type size {1} for {2}\n", s->m_dt.size, s->m_name.cstr()); + } + else if (s->m_dt.is_custom) + { + /* do nothing */ + } + else + netlist().log().fatal("found unsupported save element {1}\n", s->m_name); } - } // ---------------------------------------------------------------------------------------- @@ -566,7 +557,7 @@ void netlist_mame_sound_device_t::device_start() // Configure outputs - plib::pvector_t outdevs = netlist().get_device_list(); + std::vector outdevs = netlist().get_device_list(); if (outdevs.size() == 0) fatalerror("No output devices"); @@ -592,7 +583,7 @@ void netlist_mame_sound_device_t::device_start() m_num_inputs = 0; m_in = nullptr; - plib::pvector_t indevs = netlist().get_device_list(); + std::vector indevs = netlist().get_device_list(); if (indevs.size() > 1) fatalerror("A maximum of one input device is allowed!"); if (indevs.size() == 1) diff --git a/src/devices/machine/netlist.h b/src/devices/machine/netlist.h index 8eba71f8ba1..81e8f036d93 100644 --- a/src/devices/machine/netlist.h +++ b/src/devices/machine/netlist.h @@ -507,10 +507,9 @@ public: : device_t(anetlist, name) , m_in(*this, "IN") , m_cpu_device(nullptr) - , m_last(0) + , m_last(*this, "m_last", 0) { m_cpu_device = downcast(&downcast(netlist()).parent()); - save(NLNAME(m_last)); } ATTR_COLD void reset() override @@ -542,7 +541,7 @@ private: netlist::analog_input_t m_in; netlist_analog_output_delegate m_callback; netlist_mame_cpu_device_t *m_cpu_device; - nl_double m_last; + netlist::state_var m_last; }; // ---------------------------------------------------------------------------------------- @@ -557,10 +556,10 @@ public: , m_channel(*this, "CHAN", 0) , m_mult(*this, "MULT", 1000.0) , m_offset(*this, "OFFSET", 0.0) + , m_sample(netlist::netlist_time::from_hz(1)) //sufficiently big enough , m_in(*this, "IN") + , m_last_buffer(*this, "m_last_buffer", netlist::netlist_time::zero()) { - m_sample = netlist::netlist_time::from_hz(1); //sufficiently big enough - save(NAME(m_last_buffer)); } static const int BUFSIZE = 2048; @@ -615,7 +614,7 @@ private: netlist::analog_input_t m_in; double m_cur; int m_last_pos; - netlist::netlist_time m_last_buffer; + netlist::state_var m_last_buffer; }; // ---------------------------------------------------------------------------------------- diff --git a/src/lib/netlist/analog/nld_bjt.h b/src/lib/netlist/analog/nld_bjt.h index e8b80b94b4c..bb9f6863ec1 100644 --- a/src/lib/netlist/analog/nld_bjt.h +++ b/src/lib/netlist/analog/nld_bjt.h @@ -105,7 +105,7 @@ NETLIB_OBJECT_DERIVED(QBJT_switch, QBJT) , m_gB(NETLIST_GMIN_DEFAULT) , m_gC(NETLIST_GMIN_DEFAULT) , m_V(0.0) - , m_state_on(0) + , m_state_on(*this, "m_state_on", 0) { register_subalias("B", m_RB.m_P); register_subalias("E", m_RB.m_N); @@ -119,8 +119,6 @@ NETLIB_OBJECT_DERIVED(QBJT_switch, QBJT) connect_late(m_RB.m_P, m_BC_dummy.m_P); connect_late(m_RC.m_P, m_BC_dummy.m_N); - - save(NLNAME(m_state_on)); } NETLIB_RESETI(); @@ -141,7 +139,7 @@ protected: nl_double m_gB; // base conductance / switch on nl_double m_gC; // collector conductance / switch on nl_double m_V; // internal voltage source - UINT8 m_state_on; + state_var m_state_on; private: }; @@ -155,11 +153,13 @@ NETLIB_OBJECT_DERIVED(QBJT_EB, QBJT) { public: NETLIB_CONSTRUCTOR_DERIVED(QBJT_EB, QBJT) - , m_D_CB(*this, "m_D_CB", true) - , m_D_EB(*this, "m_D_EB", true) - , m_D_EC(*this, "m_D_EC", true) - , m_alpha_f(0) - , m_alpha_r(0) + , m_gD_BC(*this, "m_D_BC") + , m_gD_BE(*this, "m_D_BE") + , m_D_CB(*this, "m_D_CB", true) + , m_D_EB(*this, "m_D_EB", true) + , m_D_EC(*this, "m_D_EC", true) + , m_alpha_f(0) + , m_alpha_r(0) { register_subalias("E", m_D_EB.m_P); // Cathode register_subalias("B", m_D_EB.m_N); // Anode @@ -173,9 +173,6 @@ public: connect_late(m_D_EB.m_P, m_D_EC.m_P); connect_late(m_D_EB.m_N, m_D_CB.m_N); connect_late(m_D_CB.m_P, m_D_EC.m_N); - - m_gD_BE.save("m_D_BE", *this); - m_gD_BC.save("m_D_BC", *this); } protected: diff --git a/src/lib/netlist/analog/nld_opamps.h b/src/lib/netlist/analog/nld_opamps.h index 850886b7a0e..6bef8b0bbdc 100644 --- a/src/lib/netlist/analog/nld_opamps.h +++ b/src/lib/netlist/analog/nld_opamps.h @@ -44,7 +44,7 @@ NETLIB_OBJECT(OPAMP) , m_G1(*this, "G1") , m_VCC(*this, "VCC") , m_GND(*this, "GND") - , m_model(*this, "MODEL", "") + , m_model(*this, "MODEL", "LM324") , m_VH(*this, "VH") , m_VL(*this, "VL") , m_VREF(*this, "VREF") diff --git a/src/lib/netlist/analog/nld_twoterm.cpp b/src/lib/netlist/analog/nld_twoterm.cpp index 9a526c4c174..0460d6f2e71 100644 --- a/src/lib/netlist/analog/nld_twoterm.cpp +++ b/src/lib/netlist/analog/nld_twoterm.cpp @@ -19,12 +19,18 @@ namespace netlist // generic_diode // ---------------------------------------------------------------------------------------- -generic_diode::generic_diode() +generic_diode::generic_diode(device_t &dev, pstring name) + : m_Vd(dev, name + ".m_Vd", 0.7) + , m_Id(dev, name + ".m_Id", 0.0) + , m_G(dev, name + ".m_G", 1e-15) + , m_Vt(0.0) + , m_Is(0.0) + , m_n(0.0) + , m_gmin(1e-15) + , m_VtInv(0.0) + , m_Vcrit(0.0) { - m_Vd = 0.7; set_param(1e-15, 1, 1e-15); - m_G = m_gmin; - m_Id = 0.0; } void generic_diode::set_param(const nl_double Is, const nl_double n, nl_double gmin) @@ -40,13 +46,6 @@ void generic_diode::set_param(const nl_double Is, const nl_double n, nl_double g m_VtInv = 1.0 / m_Vt; } -void generic_diode::save(pstring name, object_t &parent) -{ - parent.save(m_Vd, name + ".m_Vd"); - parent.save(m_Id, name + ".m_Id"); - parent.save(m_G, name + ".m_G"); -} - // ---------------------------------------------------------------------------------------- // nld_twoterm // ---------------------------------------------------------------------------------------- diff --git a/src/lib/netlist/analog/nld_twoterm.h b/src/lib/netlist/analog/nld_twoterm.h index d94b1498a53..0b9f68b7fdd 100644 --- a/src/lib/netlist/analog/nld_twoterm.h +++ b/src/lib/netlist/analog/nld_twoterm.h @@ -311,7 +311,7 @@ private: class generic_diode { public: - generic_diode(); + generic_diode(device_t &dev, pstring name); inline void update_diode(const nl_double nVd) { @@ -360,12 +360,10 @@ public: /* owning object must save those ... */ - void save(pstring name, object_t &parent); - private: - nl_double m_Vd; - nl_double m_Id; - nl_double m_G; + state_var m_Vd; + state_var m_Id; + state_var m_G; nl_double m_Vt; nl_double m_Is; @@ -385,11 +383,10 @@ NETLIB_OBJECT_DERIVED(D, twoterm) public: NETLIB_CONSTRUCTOR_DERIVED(D, twoterm) , m_model(*this, "MODEL", "") + , m_D(*this, "m_D") { register_subalias("A", m_P); register_subalias("K", m_N); - - m_D.save("m_D", *this); } NETLIB_DYNAMIC() diff --git a/src/lib/netlist/devices/nld_4020.cpp b/src/lib/netlist/devices/nld_4020.cpp index 93916c344bc..f0e79ece754 100644 --- a/src/lib/netlist/devices/nld_4020.cpp +++ b/src/lib/netlist/devices/nld_4020.cpp @@ -22,9 +22,8 @@ namespace netlist , m_IP(*this, "IP") , m_Q(*this, {{"Q1", "_Q2", "_Q3", "Q4", "Q5", "Q6", "Q7", "Q8", "Q9", "Q10", "Q11", "Q12", "Q13", "Q14"}}) - , m_cnt(0) + , m_cnt(*this, "m_cnt", 0) { - save(NLNAME(m_cnt)); } NETLIB_RESETI() @@ -41,7 +40,7 @@ namespace netlist logic_input_t m_IP; object_array_t m_Q; - UINT16 m_cnt; + state_var m_cnt; }; NETLIB_OBJECT(CD4020) diff --git a/src/lib/netlist/devices/nld_74107.cpp b/src/lib/netlist/devices/nld_74107.cpp index 4dfa8b9aa8a..c6adf487db9 100644 --- a/src/lib/netlist/devices/nld_74107.cpp +++ b/src/lib/netlist/devices/nld_74107.cpp @@ -18,14 +18,10 @@ namespace netlist , m_clk(*this, "CLK") , m_Q(*this, "Q") , m_QQ(*this, "QQ") - , m_Q1(0) - , m_Q2(0) - , m_F(0) - + , m_Q1(*this, "m_Q1", 0) + , m_Q2(*this, "m_Q2", 0) + , m_F(*this, "m_F", 0) { - save(NLNAME(m_Q1)); - save(NLNAME(m_Q2)); - save(NLNAME(m_F)); } NETLIB_RESETI(); @@ -37,9 +33,9 @@ namespace netlist logic_output_t m_Q; logic_output_t m_QQ; - netlist_sig_t m_Q1; - netlist_sig_t m_Q2; - netlist_sig_t m_F; + state_var m_Q1; + state_var m_Q2; + state_var m_F; void newstate(const netlist_sig_t state); diff --git a/src/lib/netlist/devices/nld_74123.cpp b/src/lib/netlist/devices/nld_74123.cpp index 943fd3e14df..29cd3cd97ac 100644 --- a/src/lib/netlist/devices/nld_74123.cpp +++ b/src/lib/netlist/devices/nld_74123.cpp @@ -32,6 +32,9 @@ namespace netlist , m_Q(*this, "Q") , m_QQ(*this, "QQ") , m_CV(*this, "_CV") // internal + , m_last_trig(*this, "m_last_trig", 0) + , m_state(*this, "m_state", 0) + , m_KP(*this, "m_KP", 0) , m_K(*this, "K", (m_dev_type == 4538) ? 0.4 : 0.4) , m_RI(*this, "RI", 400.0) // around 250 for HC series, 400 on LS/TTL, estimated from datasheets { @@ -49,10 +52,6 @@ namespace netlist connect_late(m_RN.m_R.m_P, m_RP.m_R.m_N); connect_late(m_CV, m_RN.m_R.m_P); - - save(NLNAME(m_last_trig)); - save(NLNAME(m_state)); - save(NLNAME(m_KP)); } NETLIB_RESETI(); @@ -75,9 +74,9 @@ namespace netlist analog_input_t m_CV; - netlist_sig_t m_last_trig; - UINT8 m_state; - double m_KP; + state_var m_last_trig; + state_var m_state; + state_var m_KP; param_double_t m_K; param_double_t m_RI; diff --git a/src/lib/netlist/devices/nld_74153.cpp b/src/lib/netlist/devices/nld_74153.cpp index 32497c627e3..bd95659e76a 100644 --- a/src/lib/netlist/devices/nld_74153.cpp +++ b/src/lib/netlist/devices/nld_74153.cpp @@ -23,9 +23,8 @@ namespace netlist , m_C(*this, {{"C0", "C1", "C2", "C3"}}) , m_G(*this, "G") , m_Y(*this, "AY") //FIXME: Change netlists - , m_chan(0) + , m_chan(*this, "m_chan", 0) { - save(NLNAME(m_chan)); } NETLIB_RESETI(); @@ -37,7 +36,7 @@ namespace netlist logic_output_t m_Y; - int m_chan; + state_var m_chan; }; NETLIB_OBJECT(74153) diff --git a/src/lib/netlist/devices/nld_74175.cpp b/src/lib/netlist/devices/nld_74175.cpp index 79c4fb85d1a..66d98451ad4 100644 --- a/src/lib/netlist/devices/nld_74175.cpp +++ b/src/lib/netlist/devices/nld_74175.cpp @@ -18,10 +18,9 @@ namespace netlist , m_CLK(*this, "CLK") , m_Q(*this, {{"Q1", "Q2", "Q3", "Q4"}}) , m_QQ(*this, {{"Q1Q", "Q2Q", "Q3Q", "Q4Q"}}) - , m_data(0) + , m_clrq(*this, "m_clr", 0) + , m_data(*this, "m_data", 0) { - save(NLNAME(m_clrq)); - save(NLNAME(m_data)); } NETLIB_RESETI(); @@ -32,8 +31,8 @@ namespace netlist object_array_t m_Q; object_array_t m_QQ; - netlist_sig_t m_clrq; - UINT8 m_data; + state_var m_clrq; + state_var m_data; }; NETLIB_OBJECT(74175) diff --git a/src/lib/netlist/devices/nld_74192.cpp b/src/lib/netlist/devices/nld_74192.cpp index cc0260fd99a..216fc75224c 100644 --- a/src/lib/netlist/devices/nld_74192.cpp +++ b/src/lib/netlist/devices/nld_74192.cpp @@ -48,6 +48,9 @@ namespace netlist , m_LOADQ(*this, "LOADQ") , m_CU(*this, "CU") , m_CD(*this, "CD") + , m_cnt(*this, "m_cnt", 0) + , m_last_CU(*this, "m_last_CU", 0) + , m_last_CD(*this, "m_last_CD", 0) , m_Q(*this, {{"QA", "QB", "QC", "QD"}}) , m_BORROWQ(*this, "BORROWQ") , m_CARRYQ(*this, "CARRYQ") @@ -56,10 +59,6 @@ namespace netlist register_subalias("B", m_ABCD.m_B); register_subalias("C", m_ABCD.m_C); register_subalias("D", m_ABCD.m_D); - - save(NLNAME(m_cnt)); - save(NLNAME(m_last_CU)); - save(NLNAME(m_last_CD)); } NETLIB_RESETI(); @@ -72,9 +71,9 @@ namespace netlist logic_input_t m_CU; logic_input_t m_CD; - INT8 m_cnt; - UINT8 m_last_CU; - UINT8 m_last_CD; + state_var m_cnt; + state_var m_last_CU; + state_var m_last_CD; object_array_t m_Q; logic_output_t m_BORROWQ; diff --git a/src/lib/netlist/devices/nld_74193.cpp b/src/lib/netlist/devices/nld_74193.cpp index 0742ff1ce54..264c348e656 100644 --- a/src/lib/netlist/devices/nld_74193.cpp +++ b/src/lib/netlist/devices/nld_74193.cpp @@ -25,17 +25,13 @@ namespace netlist , m_LOADQ(*this, "LOADQ") , m_CU(*this, "CU") , m_CD(*this, "CD") - , m_cnt(0) - , m_last_CU(0) - , m_last_CD(0) + , m_cnt(*this, "m_cnt", 0) + , m_last_CU(*this, "m_last_CU", 0) + , m_last_CD(*this, "m_last_CD", 0) , m_Q(*this, {{"QA", "QB", "QC", "QD"}}) , m_BORROWQ(*this, "BORROWQ") , m_CARRYQ(*this, "CARRYQ") { - - save(NLNAME(m_cnt)); - save(NLNAME(m_last_CU)); - save(NLNAME(m_last_CD)); } NETLIB_RESETI(); @@ -51,9 +47,9 @@ namespace netlist logic_input_t m_CU; logic_input_t m_CD; - INT8 m_cnt; - UINT8 m_last_CU; - UINT8 m_last_CD; + state_var m_cnt; + state_var m_last_CU; + state_var m_last_CD; object_array_t m_Q; logic_output_t m_BORROWQ; diff --git a/src/lib/netlist/devices/nld_7448.cpp b/src/lib/netlist/devices/nld_7448.cpp index edb11783d2e..88ccaffe83d 100644 --- a/src/lib/netlist/devices/nld_7448.cpp +++ b/src/lib/netlist/devices/nld_7448.cpp @@ -37,10 +37,9 @@ namespace netlist , m_LTQ(*this, "LTQ") , m_BIQ(*this, "BIQ") , m_RBIQ(*this, "RBIQ") - , m_state(0) + , m_state(*this, "m_state", 0) , m_Q(*this, {{"a", "b", "c", "d", "e", "f", "g"}}) { - save(NLNAME(m_state)); } NETLIB_RESETI(); @@ -58,7 +57,7 @@ namespace netlist logic_input_t m_BIQ; logic_input_t m_RBIQ; - UINT8 m_state; + state_var m_state; object_array_t m_Q; /* a .. g */ diff --git a/src/lib/netlist/devices/nld_7474.cpp b/src/lib/netlist/devices/nld_7474.cpp index 55355d83cad..2d662ab73db 100644 --- a/src/lib/netlist/devices/nld_7474.cpp +++ b/src/lib/netlist/devices/nld_7474.cpp @@ -18,10 +18,8 @@ namespace netlist , m_CLK(*this, "CLK") , m_Q(*this, "Q") , m_QQ(*this, "QQ") - , m_nextD(0) + , m_nextD(*this, "m_nextD", 0) { - - save(NLNAME(m_nextD)); } NETLIB_RESETI(); @@ -31,7 +29,7 @@ namespace netlist logic_input_t m_CLK; logic_output_t m_Q; logic_output_t m_QQ; - INT8 m_nextD; + state_var m_nextD; inline void newstate(const UINT8 stateQ, const UINT8 stateQQ); diff --git a/src/lib/netlist/devices/nld_7483.cpp b/src/lib/netlist/devices/nld_7483.cpp index db23f26d563..a34c2b832c8 100644 --- a/src/lib/netlist/devices/nld_7483.cpp +++ b/src/lib/netlist/devices/nld_7483.cpp @@ -24,14 +24,13 @@ namespace netlist , m_B2(*this, "B2") , m_B3(*this, "B3") , m_B4(*this, "B4") - , m_lastr(0) + , m_lastr(*this, "m_lastr", 0) , m_S1(*this, "S1") , m_S2(*this, "S2") , m_S3(*this, "S3") , m_S4(*this, "S4") , m_C4(*this, "C4") { - save(NLNAME(m_lastr)); } NETLIB_RESETI(); NETLIB_UPDATEI(); @@ -47,7 +46,7 @@ namespace netlist logic_input_t m_B3; logic_input_t m_B4; - UINT8 m_lastr; + state_var m_lastr; logic_output_t m_S1; logic_output_t m_S2; diff --git a/src/lib/netlist/devices/nld_7490.cpp b/src/lib/netlist/devices/nld_7490.cpp index c47cc1d94a9..709a7920d3f 100644 --- a/src/lib/netlist/devices/nld_7490.cpp +++ b/src/lib/netlist/devices/nld_7490.cpp @@ -21,14 +21,11 @@ namespace netlist , m_R2(*this, "R2") , m_R91(*this, "R91") , m_R92(*this, "R92") - , m_cnt(0) - , m_last_A(0) - , m_last_B(0) + , m_cnt(*this, "m_cnt", 0) + , m_last_A(*this, "m_last_A", 0) + , m_last_B(*this, "m_last_B", 0) , m_Q(*this, {{"QA", "QB", "QC", "QD"}}) { - save(NLNAME(m_cnt)); - save(NLNAME(m_last_A)); - save(NLNAME(m_last_B)); } NETLIB_UPDATEI(); @@ -44,9 +41,9 @@ namespace netlist logic_input_t m_R91; logic_input_t m_R92; - UINT8 m_cnt; - UINT8 m_last_A; - UINT8 m_last_B; + state_var m_cnt; + state_var m_last_A; + state_var m_last_B; object_array_t m_Q; }; diff --git a/src/lib/netlist/devices/nld_7493.cpp b/src/lib/netlist/devices/nld_7493.cpp index b60972d8dad..138e65dded1 100644 --- a/src/lib/netlist/devices/nld_7493.cpp +++ b/src/lib/netlist/devices/nld_7493.cpp @@ -19,10 +19,9 @@ namespace netlist NETLIB_CONSTRUCTOR(7493ff) , m_I(*this, "CLK") , m_Q(*this, "Q") + , m_reset(*this, "m_reset", 0) + , m_state(*this, "m_state", 0) { - - save(NLNAME(m_reset)); - save(NLNAME(m_state)); } NETLIB_RESETI(); @@ -32,8 +31,8 @@ namespace netlist logic_input_t m_I; logic_output_t m_Q; - UINT8 m_reset; - UINT8 m_state; + state_var m_reset; + state_var m_state; }; NETLIB_OBJECT(7493) diff --git a/src/lib/netlist/devices/nld_74ls629.cpp b/src/lib/netlist/devices/nld_74ls629.cpp index eb9fbd7f712..bd8127f068c 100644 --- a/src/lib/netlist/devices/nld_74ls629.cpp +++ b/src/lib/netlist/devices/nld_74ls629.cpp @@ -52,15 +52,11 @@ namespace netlist NETLIB_CONSTRUCTOR(SN74LS629clk) , m_FB(*this, "FB") , m_Y(*this, "Y") - , m_enableq(1) - , m_out(0) - , m_inc(netlist_time::zero()) + , m_enableq(*this, "m_enableq", 1) + , m_out(*this, "m_out", 0) + , m_inc(*this, "m_inc", netlist_time::zero()) { connect_late(m_FB, m_Y); - - save(NLNAME(m_enableq)); - save(NLNAME(m_inc)); - save(NLNAME(m_out)); } NETLIB_RESETI() @@ -76,9 +72,9 @@ namespace netlist logic_input_t m_FB; logic_output_t m_Y; - netlist_sig_t m_enableq; - netlist_sig_t m_out; - netlist_time m_inc; + state_var m_enableq; + state_var m_out; + state_var m_inc; }; NETLIB_OBJECT(SN74LS629) diff --git a/src/lib/netlist/devices/nld_82S16.cpp b/src/lib/netlist/devices/nld_82S16.cpp index 9b3e32cd291..aa7e2da3765 100644 --- a/src/lib/netlist/devices/nld_82S16.cpp +++ b/src/lib/netlist/devices/nld_82S16.cpp @@ -22,8 +22,8 @@ namespace netlist , m_WEQ(*this, "WEQ") , m_DIN(*this, "DIN") , m_DOUTQ(*this, "DOUTQ") + , m_ram(*this, "m_ram", 0) { - save(NLNAME(m_ram)); } NETLIB_RESETI(); @@ -39,7 +39,7 @@ namespace netlist logic_output_t m_DOUTQ; //netlist_state_t m_ram; - UINT64 m_ram[4]; // 256 bits + state_var m_ram; // 256 bits }; NETLIB_OBJECT_DERIVED(82S16_dip, 82S16) diff --git a/src/lib/netlist/devices/nld_9310.cpp b/src/lib/netlist/devices/nld_9310.cpp index 97c2d2b0a7f..3bacf460892 100644 --- a/src/lib/netlist/devices/nld_9310.cpp +++ b/src/lib/netlist/devices/nld_9310.cpp @@ -50,13 +50,10 @@ namespace netlist , m_QC(*this, "QC") , m_QD(*this, "QD") , m_RC(*this, "RC") - , m_cnt(0) - , m_loadq(0) - , m_ent(0) + , m_cnt(*this, "m_cnt", 0) + , m_loadq(*this, "m_loadq", 0) + , m_ent(*this, "m_ent", 0) { - save(NLNAME(m_cnt)); - save(NLNAME(m_loadq)); - save(NLNAME(m_ent)); } NETLIB_RESETI(); NETLIB_UPDATEI(); @@ -73,9 +70,9 @@ namespace netlist logic_output_t m_QC; logic_output_t m_QD; logic_output_t m_RC; - UINT8 m_cnt; - netlist_sig_t m_loadq; - netlist_sig_t m_ent; + state_var m_cnt; + state_var m_loadq; + state_var m_ent; }; NETLIB_OBJECT(9310) diff --git a/src/lib/netlist/devices/nld_9316.cpp b/src/lib/netlist/devices/nld_9316.cpp index 287a9b6669d..3083b77ba6a 100644 --- a/src/lib/netlist/devices/nld_9316.cpp +++ b/src/lib/netlist/devices/nld_9316.cpp @@ -49,15 +49,11 @@ namespace netlist , m_QC(*this, "QC") , m_QD(*this, "QD") , m_RC(*this, "RC") - , m_cnt(0) , m_ABCD(nullptr) - , m_loadq(0) - , m_ent(0) + , m_cnt(*this, "m_cnt", 0) + , m_loadq(*this, "m_loadq", 0) + , m_ent(*this, "m_ent", 0) { - - save(NLNAME(m_cnt)); - save(NLNAME(m_loadq)); - save(NLNAME(m_ent)); } NETLIB_RESETI(); @@ -75,10 +71,10 @@ namespace netlist logic_output_t m_QD; logic_output_t m_RC; - UINT8 m_cnt; NETLIB_NAME(9316_subABCD) *m_ABCD; - netlist_sig_t m_loadq; - netlist_sig_t m_ent; + state_var m_cnt; + state_var m_loadq; + state_var m_ent; }; NETLIB_OBJECT(9316) diff --git a/src/lib/netlist/devices/nld_legacy.cpp b/src/lib/netlist/devices/nld_legacy.cpp index aaf7c9e25a3..f3675468513 100644 --- a/src/lib/netlist/devices/nld_legacy.cpp +++ b/src/lib/netlist/devices/nld_legacy.cpp @@ -42,9 +42,8 @@ namespace netlist , m_Q(*this, "2") , m_L_to_H(*this, "L_TO_H", 10) , m_H_to_L(*this, "H_TO_L", 10) - , m_last(0) + , m_last(*this, "m_last", 0) { - save(NLNAME(m_last)); } //NETLIB_UPDATE_PARAMI(); @@ -58,7 +57,7 @@ namespace netlist param_int_t m_L_to_H; param_int_t m_H_to_L; - UINT8 m_last; + state_var m_last; }; NETLIB_RESET(nicRSFF) diff --git a/src/lib/netlist/devices/nld_mm5837.cpp b/src/lib/netlist/devices/nld_mm5837.cpp index 9624bec2621..c41c58adbae 100644 --- a/src/lib/netlist/devices/nld_mm5837.cpp +++ b/src/lib/netlist/devices/nld_mm5837.cpp @@ -28,10 +28,10 @@ namespace netlist /* clock */ , m_feedback(*this, "FB") , m_Q(*this, "Q") - , m_inc(0, 1) + , m_inc(netlist_time::from_hz(56000)) + , m_shift(*this, "m_shift", 0) , m_is_timestep(false) { - m_inc = netlist_time::from_hz(56000); connect_late(m_feedback, m_Q); /* output */ @@ -41,9 +41,6 @@ namespace netlist /* device */ register_subalias("3", m_RV.m_P); - - save(NLNAME(m_shift)); - } NETLIB_RESETI(); @@ -61,10 +58,10 @@ namespace netlist /* clock stage */ logic_input_t m_feedback; logic_output_t m_Q; - netlist_time m_inc; + const netlist_time m_inc; /* state */ - UINT32 m_shift; + state_var m_shift; /* cache */ bool m_is_timestep; diff --git a/src/lib/netlist/devices/nld_ne555.cpp b/src/lib/netlist/devices/nld_ne555.cpp index 2197beea776..e2553099cbd 100644 --- a/src/lib/netlist/devices/nld_ne555.cpp +++ b/src/lib/netlist/devices/nld_ne555.cpp @@ -28,8 +28,8 @@ namespace netlist , m_THRES(*this, "THRESH") // Pin 6 , m_TRIG(*this, "TRIG") // Pin 2 , m_OUT(*this, "OUT") // Pin 3 - , m_last_out(false) - , m_ff(false) + , m_last_out(*this, "m_last_out", false) + , m_ff(*this, "m_ff", false) { register_subalias("GND", m_R3.m_N); // Pin 1 @@ -40,9 +40,6 @@ namespace netlist connect_late(m_R1.m_N, m_R2.m_P); connect_late(m_R2.m_N, m_R3.m_P); connect_late(m_RDIS.m_N, m_R3.m_N); - - save(NLNAME(m_last_out)); - save(NLNAME(m_ff)); } NETLIB_UPDATEI(); @@ -60,8 +57,8 @@ namespace netlist analog_output_t m_OUT; private: - bool m_last_out; - bool m_ff; + state_var m_last_out; + state_var m_ff; inline nl_double clamp(const nl_double v, const nl_double a, const nl_double b); diff --git a/src/lib/netlist/devices/nld_system.cpp b/src/lib/netlist/devices/nld_system.cpp index c7467f7e3cc..dbbccb78a72 100644 --- a/src/lib/netlist/devices/nld_system.cpp +++ b/src/lib/netlist/devices/nld_system.cpp @@ -30,7 +30,7 @@ namespace netlist NETLIB_UPDATE(clock) { - OUTLOGIC(m_Q, !m_Q.net().new_Q(), m_inc ); + OUTLOGIC(m_Q, !INPLOGIC(m_feedback), m_inc ); } // ---------------------------------------------------------------------------------------- @@ -187,7 +187,7 @@ namespace netlist stack[ptr-1] = stack[ptr-1] / stack[ptr]; break; case PUSH_INPUT: - stack[ptr++] = INPANALOG(m_I[(int) rc.m_param]); + stack[ptr++] = INPANALOG((*m_I[(int) rc.m_param])); break; case PUSH_CONST: stack[ptr++] = rc.m_param; diff --git a/src/lib/netlist/devices/nld_truthtable.h b/src/lib/netlist/devices/nld_truthtable.h index d5772907df6..2d439de4f6b 100644 --- a/src/lib/netlist/devices/nld_truthtable.h +++ b/src/lib/netlist/devices/nld_truthtable.h @@ -180,9 +180,9 @@ namespace netlist truthtable_t *ttp, const char *desc[]) : device_t(owner, name) , m_fam(*this, fam) - , m_last_state(0) - , m_ign(0) - , m_active(1) + , m_last_state(*this, "m_last_state", 0) + , m_ign(*this, "m_ign", 0) + , m_active(*this, "m_active", 1) , m_ttp(ttp) { while (*desc != nullptr && **desc != 0 ) @@ -198,9 +198,9 @@ namespace netlist truthtable_t *ttp, const plib::pstring_vector_t &desc) : device_t(owner, name) , m_fam(*this, fam) - , m_last_state(0) - , m_ign(0) - , m_active(1) + , m_last_state(*this, "m_last_state", 0) + , m_ign(*this, "m_ign", 0) + , m_active(*this, "m_active", 1) , m_ttp(ttp) { m_desc = desc; @@ -235,7 +235,7 @@ namespace netlist for (std::size_t i=0; i < m_NO; i++) { pstring tmp = "_" + out[i]; - const int idx = inout.indexof(tmp); + const int idx = plib::container::indexof(inout, tmp); if (idx>=0) { connect_late(m_Q[i], m_I[idx]); @@ -260,9 +260,6 @@ namespace netlist for (int k=0; m_ttp.m_timing_nt[k] != netlist_time::zero(); k++) printf("%d %f\n", k, m_ttp.m_timing_nt[k].as_double() * 1000000.0); #endif - save(NLNAME(m_last_state)); - save(NLNAME(m_ign)); - save(NLNAME(m_active)); } NETLIB_RESETI() @@ -389,9 +386,9 @@ namespace netlist } } - UINT32 m_last_state; - UINT32 m_ign; - INT32 m_active; + state_var m_last_state; + state_var m_ign; + state_var m_active; truthtable_t *m_ttp; plib::pstring_vector_t m_desc; diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h index 8547fcfe22f..b7c2116cb54 100644 --- a/src/lib/netlist/devices/nlid_system.h +++ b/src/lib/netlist/devices/nlid_system.h @@ -11,6 +11,8 @@ #ifndef NLID_SYSTEM_H_ #define NLID_SYSTEM_H_ +#include + #include "nl_setup.h" #include "nl_base.h" #include "nl_factory.h" @@ -119,6 +121,8 @@ namespace netlist , m_offset(*this, "OFFSET", 0.0) , m_feedback(*this, "FB") , m_Q(*this, "Q") + , m_cnt(*this, "m_cnt", 0) + , m_off(*this, "m_off", netlist_time::zero()) { m_inc[0] = netlist_time::from_hz(m_freq.Value()*2); @@ -144,8 +148,6 @@ namespace netlist } m_inc[m_size - 1] = base * total - ttotal; } - save(NLNAME(m_cnt)); - save(NLNAME(m_off)); } NETLIB_UPDATEI(); NETLIB_RESETI(); @@ -158,10 +160,10 @@ namespace netlist logic_input_t m_feedback; logic_output_t m_Q; - unsigned m_cnt; - unsigned m_size; netlist_time m_inc[32]; - netlist_time m_off; + state_var m_cnt; + state_var m_off; + unsigned m_size; }; // ----------------------------------------------------------------------------- @@ -258,7 +260,7 @@ namespace netlist { public: NETLIB_CONSTRUCTOR_DERIVED(frontier, base_dummy) - , m_RIN(*this, "m_RIN") + , m_RIN(*this, "m_RIN", true) , m_ROUT(*this, "m_ROUT", true) , m_I(*this, "_I") , m_Q(*this, "_Q") @@ -312,7 +314,7 @@ namespace netlist { for (std::size_t i=0; i < m_N; i++) - m_I.emplace(i, *this, plib::pfmt("A{1}")(i)); + m_I.push_back(plib::make_unique(*this, plib::pfmt("A{1}")(i))); plib::pstring_vector_t cmds(m_func.Value(), " "); m_precompiled.clear(); @@ -375,9 +377,9 @@ namespace netlist param_int_t m_N; param_str_t m_func; analog_output_t m_Q; - plib::uninitialised_array_t m_I; + std::vector> m_I; - plib::pvector_t m_precompiled; + std::vector m_precompiled; }; // ----------------------------------------------------------------------------- @@ -392,12 +394,10 @@ namespace netlist , m_I(*this, "I") , m_RON(*this, "RON", 1.0) , m_ROFF(*this, "ROFF", 1.0E20) - , m_last_state(0) + , m_last_state(*this, "m_last_state", 0) { register_subalias("1", m_R.m_P); register_subalias("2", m_R.m_N); - - save(NLNAME(m_last_state)); } NETLIB_SUB(R) m_R; @@ -415,7 +415,7 @@ namespace netlist private: - UINT8 m_last_state; + state_var m_last_state; }; // ----------------------------------------------------------------------------- @@ -518,7 +518,7 @@ namespace netlist : nld_base_d_to_a_proxy(anetlist, name, out_proxied, m_RV.m_P) , m_GNDHack(*this, "_Q") , m_RV(*this, "RV") - , m_last_state(-1) + , m_last_state(*this, "m_last_var", -1) , m_is_timestep(false) { //register_sub(m_RV); @@ -528,8 +528,6 @@ namespace netlist register_subalias("Q", m_RV.m_P); connect_late(m_RV.m_N, m_GNDHack); - - save(NLNAME(m_last_state)); } virtual ~nld_d_to_a_proxy() {} @@ -542,7 +540,7 @@ namespace netlist private: analog_output_t m_GNDHack; // FIXME: Long term, we need to connect proxy gnd to device gnd NETLIB_SUB(twoterm) m_RV; - int m_last_state; + state_var m_last_state; bool m_is_timestep; }; diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 6c1df62290d..02dcbf1ee6d 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -105,14 +105,14 @@ const logic_family_desc_t *family_CD4XXX() queue_t::queue_t(netlist_t &nl) : timed_queue(512) , object_t(nl, "QUEUE", QUEUE) - , plib::pstate_callback_t() + , plib::state_manager_t::callback_t() , m_qsize(0) , m_times(512) , m_names(512) { } -void queue_t::register_state(plib::pstate_manager_t &manager, const pstring &module) +void queue_t::register_state(plib::state_manager_t &manager, const pstring &module) { netlist().log().debug("register_state\n"); manager.save_item(this, m_qsize, module + "." + "qsize"); @@ -186,22 +186,21 @@ device_object_t::device_object_t(core_device_t &dev, const pstring &aname, const // ---------------------------------------------------------------------------------------- netlist_t::netlist_t(const pstring &aname) - : pstate_manager_t(), - m_stop(netlist_time::zero()), - m_time(netlist_time::zero()), - m_use_deactivate(0), - m_queue(*this), - m_mainclock(nullptr), - m_solver(nullptr), - m_gnd(nullptr), - m_params(nullptr), - m_name(aname), - m_setup(nullptr), - m_log(this), - m_lib(nullptr) + : m_state() + , m_time(netlist_time::zero()) + , m_queue(*this) + , m_use_deactivate(0) + , m_mainclock(nullptr) + , m_solver(nullptr) + , m_gnd(nullptr) + , m_params(nullptr) + , m_name(aname) + , m_setup(nullptr) + , m_log(this) + , m_lib(nullptr) { - save_item(this, static_cast(m_queue), "m_queue"); - save_item(this, m_time, "m_time"); + state().save_item(this, static_cast(m_queue), "m_queue"); + state().save_item(this, m_time, "m_time"); } netlist_t::~netlist_t() @@ -331,51 +330,43 @@ void netlist_t::reset() void netlist_t::process_queue(const netlist_time &delta) { - m_stop = m_time + delta; + netlist_time stop(m_time + delta); + + m_queue.push(stop, nullptr); if (m_mainclock == nullptr) { - while ( (m_time < m_stop) & (!m_queue.empty())) + queue_t::entry_t e(m_queue.pop()); + m_time = e.m_exec_time; + while (e.m_object != nullptr) { - const queue_t::entry_t e(m_queue.pop()); - m_time = e.m_exec_time; e.m_object->update_devs(); - add_to_stat(m_perf_out_processed, 1); + e = m_queue.pop(); + m_time = e.m_exec_time; } - if (m_queue.empty()) - m_time = m_stop; - - } else { + } + else + { logic_net_t &mc_net = m_mainclock->m_Q.net(); const netlist_time inc = m_mainclock->m_inc; netlist_time mc_time(mc_net.time()); - while (m_time < m_stop) + while (1) { - if (!m_queue.empty()) + while (m_queue.top().m_exec_time > mc_time) { - while (m_queue.top().m_exec_time > mc_time) - { - m_time = mc_time; - mc_time += inc; - mc_net.toggle_new_Q(); - mc_net.update_devs(); - //devices::NETLIB_NAME(mainclock)::mc_update(mc_net); - } - - const queue_t::entry_t &e = m_queue.pop(); - m_time = e.m_exec_time; - e.m_object->update_devs(); - - } else { m_time = mc_time; mc_time += inc; mc_net.toggle_new_Q(); mc_net.update_devs(); - //devices::NETLIB_NAME(mainclock)::mc_update(mc_net); } + const queue_t::entry_t e(m_queue.pop()); + m_time = e.m_exec_time; + if (e.m_object == nullptr) + break; + e.m_object->update_devs(); add_to_stat(m_perf_out_processed, 1); } mc_net.set_time(mc_time); @@ -410,7 +401,7 @@ param_template_t::param_template_t(device_t &device, const pstring name, c { /* pstrings not yet supported, these need special logic */ if (T != param_t::STRING && T != param_t::MODEL) - save(NLNAME(m_param)); + netlist().save(*this, m_param, "m_param"); device.setup().register_and_set_param(device.name() + "." + name, *this); } @@ -509,9 +500,6 @@ void device_t::register_subalias(const pstring &name, core_terminal_t &term) // everything already fully qualified setup().register_alias_nofqn(alias, term.name()); - - if (term.is_type(terminal_t::INPUT) || term.is_type(terminal_t::TERMINAL)) - m_terminals.push_back(alias); } void device_t::register_subalias(const pstring &name, const pstring &aliased) @@ -521,10 +509,6 @@ void device_t::register_subalias(const pstring &name, const pstring &aliased) // everything already fully qualified setup().register_alias_nofqn(alias, aliased_fqn); - - // FIXME: make this working again - //if (term.isType(terminal_t::INPUT) || term.isType(terminal_t::TERMINAL)) - // m_terminals.add(name); } void device_t::connect_late(core_terminal_t &t1, core_terminal_t &t2) @@ -588,17 +572,17 @@ net_t::net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr) else nl.m_nets.push_back(std::shared_ptr(this)); - save(NLNAME(m_time)); - save(NLNAME(m_active)); - save(NLNAME(m_in_queue)); - save(NLNAME(m_cur_Analog)); - save(NLNAME(m_cur_Q)); - save(NLNAME(m_new_Q)); + netlist().save(*this, m_time, "m_time"); + netlist().save(*this, m_active, "m_active"); + netlist().save(*this, m_in_queue, "m_in_queue"); + netlist().save(*this, m_cur_Analog, "m_cur_Analog"); + netlist().save(*this, m_cur_Q, "m_cur_Q"); + netlist().save(*this, m_new_Q, "m_new_Q"); } net_t::~net_t() { - netlist().remove_save_items(this); + netlist().state().remove_save_items(this); } void net_t::inc_active(core_terminal_t &term) @@ -770,19 +754,19 @@ analog_net_t::analog_net_t(netlist_t &nl, const pstring &aname, core_terminal_t { } -bool analog_net_t::already_processed(plib::pvector_t &groups) +bool analog_net_t::already_processed(std::vector &groups) { if (isRailNet()) return true; for (auto & grp : groups) { - if (grp.contains(this)) + if (plib::container::contains(grp, this)) return true; } return false; } -void analog_net_t::process_net(plib::pvector_t &groups) +void analog_net_t::process_net(std::vector &groups) { if (num_cons() == 0) return; @@ -811,7 +795,7 @@ core_terminal_t::core_terminal_t(core_device_t &dev, const pstring &aname, const , m_net(nullptr) , m_state(STATE_NONEX) { - save(NLNAME(m_state)); + netlist().save(*this, m_state, "m_state"); } void core_terminal_t::reset() @@ -822,7 +806,7 @@ void core_terminal_t::reset() set_state(STATE_INP_ACTIVE); } -void core_terminal_t::set_net(net_t::ptr_t anet) +void core_terminal_t::set_net(net_t *anet) { m_net = anet; } @@ -845,9 +829,9 @@ terminal_t::terminal_t(core_device_t &dev, const pstring &aname) , m_gt1(nullptr) { netlist().setup().register_term(*this); - save(NLNAME(m_Idr1)); - save(NLNAME(m_go1)); - save(NLNAME(m_gt1)); + netlist().save(*this, m_Idr1, "m_Idr1"); + netlist().save(*this, m_go1, "m_go1"); + netlist().save(*this, m_gt1, "m_gt1"); } diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 7828c2f3f61..607e9f313fd 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -156,8 +156,10 @@ #define NLBASE_H_ #include +#include #include #include +#include #include "nl_lists.h" #include "nl_time.h" @@ -169,11 +171,6 @@ // Type definitions // ---------------------------------------------------------------------------------------- -/* - * unsigned int would be a 20% speed increase over UINT8 for pong. - * For breakout it causes a slight decrease. - * - */ using netlist_sig_t = std::uint32_t; //============================================================ @@ -293,7 +290,7 @@ namespace netlist // model_map_t // ----------------------------------------------------------------------------- - using model_map_t = plib::hashmap_t; + using model_map_t = std::unordered_map; // ----------------------------------------------------------------------------- // logic_family_t @@ -345,7 +342,7 @@ namespace netlist // object_t // ----------------------------------------------------------------------------- - class object_t : public plib::pstate_interface_t + class object_t { P_PREVENT_COPYING(object_t) public: @@ -364,8 +361,6 @@ namespace netlist const pstring &name() const; - plib::pstate_manager_t &state_manager(); - type_t type() const { return m_objtype; } bool is_type(const type_t atype) const { return (m_objtype == atype); } @@ -408,7 +403,7 @@ namespace netlist P_PREVENT_COPYING(core_terminal_t) public: - using list_t = plib::pvector_t; + using list_t = std::vector; /* needed here ... */ @@ -475,8 +470,6 @@ namespace netlist P_PREVENT_COPYING(terminal_t) public: - using list_t = plib::pvector_t; - terminal_t(core_device_t &dev, const pstring &aname); terminal_t *m_otherterm; @@ -594,9 +587,6 @@ namespace netlist P_PREVENT_COPYING(net_t) public: - using ptr_t = net_t *; - using list_t = plib::pvector_t>; - net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr = nullptr); virtual ~net_t(); @@ -622,7 +612,7 @@ namespace netlist bool isRailNet() const { return !(m_railterminal == nullptr); } core_terminal_t & railterminal() const { return *m_railterminal; } - int num_cons() const { return m_core_terms.size(); } + std::size_t num_cons() const { return m_core_terms.size(); } void inc_active(core_terminal_t &term); void dec_active(core_terminal_t &term); @@ -631,15 +621,15 @@ namespace netlist void move_connections(net_t *new_net); - plib::pvector_t m_core_terms; // save post-start m_list ... + std::vector m_core_terms; // save post-start m_list ... protected: netlist_sig_t m_new_Q; netlist_sig_t m_cur_Q; - netlist_time m_time; - INT32 m_active; - UINT8 m_in_queue; /* 0: not in queue, 1: in queue, 2: last was taken */ + netlist_time m_time; + INT32 m_active; + UINT8 m_in_queue; /* 0: not in queue, 1: in queue, 2: last was taken */ private: plib::linkedlist_t m_list_active; @@ -656,8 +646,6 @@ namespace netlist P_PREVENT_COPYING(logic_net_t) public: - using list_t = plib::pvector_t; - logic_net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr = nullptr); virtual ~logic_net_t() { }; @@ -699,7 +687,7 @@ namespace netlist P_PREVENT_COPYING(analog_net_t) public: - using list_t = plib::pvector_t; + using list_t = std::vector; analog_net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr = nullptr); @@ -712,8 +700,8 @@ namespace netlist devices::matrix_solver_t *solver() { return m_solver; } void set_solver(devices::matrix_solver_t *solver) { m_solver = solver; } - bool already_processed(plib::pvector_t &groups); - void process_net(plib::pvector_t &groups); + bool already_processed(std::vector &groups); + void process_net(std::vector &groups); private: devices::matrix_solver_t *m_solver; @@ -835,9 +823,6 @@ namespace netlist { P_PREVENT_COPYING(core_device_t) public: - - using list_t = plib::pvector_t; - core_device_t(netlist_t &owner, const pstring &name); core_device_t(core_device_t &owner, const pstring &name); @@ -965,9 +950,6 @@ namespace netlist void connect_late(const pstring &t1, const pstring &t2); void connect_late(core_terminal_t &t1, core_terminal_t &t2); void connect_post_start(core_terminal_t &t1, core_terminal_t &t2); - - plib::pvector_t m_terminals; - protected: NETLIB_UPDATEI() { } @@ -1005,14 +987,14 @@ namespace netlist class queue_t : public timed_queue, public object_t, - public plib::pstate_callback_t + public plib::state_manager_t::callback_t { public: queue_t(netlist_t &nl); protected: - void register_state(plib::pstate_manager_t &manager, const pstring &module) override; + void register_state(plib::state_manager_t &manager, const pstring &module) override; void on_pre_save() override; void on_post_load() override; @@ -1028,7 +1010,7 @@ namespace netlist // ----------------------------------------------------------------------------- - class netlist_t : public plib::pstate_manager_t, public plib::plog_dispatch_intf //, public device_owner_t + class netlist_t : public plib::plog_dispatch_intf //, public device_owner_t { P_PREVENT_COPYING(netlist_t) public: @@ -1041,18 +1023,18 @@ namespace netlist void start(); void stop(); - const queue_t &queue() const { return m_queue; } - queue_t &queue() { return m_queue; } - const netlist_time time() const { return m_time; } - devices::NETLIB_NAME(solver) *solver() const { return m_solver; } - devices::NETLIB_NAME(gnd) *gnd() const { return m_gnd; } + const queue_t &queue() const { return m_queue; } + queue_t &queue() { return m_queue; } + const netlist_time time() const { return m_time; } + devices::NETLIB_NAME(solver) *solver() const { return m_solver; } + devices::NETLIB_NAME(gnd) *gnd() const { return m_gnd; } nl_double gmin() const; void push_to_queue(net_t &out, const netlist_time attime) NOEXCEPT; void remove_from_queue(net_t &out); void process_queue(const netlist_time &delta); - void abort_current_queue_slice() { m_stop = netlist_time::zero(); } + void abort_current_queue_slice() { m_queue.retime(m_time, nullptr); } bool use_deactivate() const { return m_use_deactivate; } @@ -1064,9 +1046,9 @@ namespace netlist net_t *find_net(const pstring &name); template - plib::pvector_t get_device_list() + std::vector get_device_list() { - plib::pvector_t tmp; + std::vector tmp; for (auto &d : m_devices) { device_class *dev = dynamic_cast(d.get()); @@ -1097,16 +1079,27 @@ namespace netlist plib::plog_base &log() { return m_log; } const plib::plog_base &log() const { return m_log; } + plib::state_manager_t &state() { return m_state; } + + template void save(O &owner, C &state, const pstring &stname) + { + this->state().save_item((void *)&owner, state, pstring(owner.name()) + "." + stname); + } + template void save(O &owner, C *state, const pstring &stname, const int count) + { + this->state().save_state_ptr((void *)&owner, pstring(owner.name()) + "." + stname, plib::state_manager_t::datatype_f::f(), count, state); + } + virtual void reset(); plib::dynlib &lib() { return *m_lib; } void print_stats() const; - plib::pvector_t> m_devices; + std::vector> m_devices; /* sole use is to manage lifetime of net objects */ - net_t::list_t m_nets; + std::vector> m_nets; /* sole use is to manage lifetime of family objects */ std::vector>> m_family_cache; @@ -1121,16 +1114,16 @@ protected: #endif private: - netlist_time m_stop; // target time for current queue processing - + plib::state_manager_t m_state; + /* mostly rw */ netlist_time m_time; - bool m_use_deactivate; queue_t m_queue; + /* mostly rw */ + bool m_use_deactivate; devices::NETLIB_NAME(mainclock) * m_mainclock; devices::NETLIB_NAME(solver) * m_solver; devices::NETLIB_NAME(gnd) * m_gnd; - devices::NETLIB_NAME(netlistparams) *m_params; pstring m_name; @@ -1139,6 +1132,50 @@ protected: plib::dynlib *m_lib; // external lib needs to be loaded as long as netlist exists }; + template + struct state_var + { + public: + state_var(device_t &dev, const pstring name, const T &value) + : m_value(value) + { + dev.netlist().save(dev, m_value, name); + } + + state_var(const state_var &rhs) NOEXCEPT = default; + state_var(state_var &&rhs) NOEXCEPT = default; + state_var &operator=(const state_var rhs) { m_value = rhs.m_value; return *this; } + state_var &operator=(const T rhs) { m_value = rhs; return *this; } + operator T & () { return m_value; } + T & operator()() { return m_value; } + operator const T & () const { return m_value; } + const T & operator()() const { return m_value; } + private: + T m_value; + }; + + template + struct state_var + { + public: + state_var(device_t &dev, const pstring name, const T & value) + { + dev.netlist().save(dev, m_value, name); + for (int i=0; i inline void param_template_t::setTo(const C ¶m) { @@ -1238,7 +1270,7 @@ protected: inline void net_t::push_to_queue(const netlist_time delay) NOEXCEPT { - if (!is_queued() && (num_cons() > 0)) + if (!is_queued() && (num_cons() != 0)) { m_time = netlist().time() + delay; m_in_queue = (m_active > 0); /* queued ? */ @@ -1320,7 +1352,5 @@ protected: } -NETLIST_SAVE_TYPE(netlist::core_terminal_t::state_e, pstate_data_type_e::DT_INT); - #endif /* NLBASE_H_ */ diff --git a/src/lib/netlist/nl_factory.h b/src/lib/netlist/nl_factory.h index 780408cd285..b85e85bf6b8 100644 --- a/src/lib/netlist/nl_factory.h +++ b/src/lib/netlist/nl_factory.h @@ -65,7 +65,7 @@ namespace netlist } }; - class factory_list_t : public plib::pvector_t> + class factory_list_t : public std::vector> { public: factory_list_t(setup_t &m_setup); diff --git a/src/lib/netlist/nl_lists.h b/src/lib/netlist/nl_lists.h index b3443ed2297..475e0e285c2 100644 --- a/src/lib/netlist/nl_lists.h +++ b/src/lib/netlist/nl_lists.h @@ -68,13 +68,12 @@ namespace netlist #if HAS_OPENMP && USE_OPENMP m_lock = 0; #endif - //nl_assert(m_end - m_list < Size); } - entry_t pop() NOEXCEPT { return *(--m_end); } - entry_t top() const NOEXCEPT { return *(m_end-1); } + entry_t pop() NOEXCEPT { return *(--m_end); } + const entry_t &top() const NOEXCEPT { return *(m_end-1); } - void remove(const Element &elem) NOEXCEPT + void remove(const Element &elem) NOEXCEPT { /* Lock */ #if HAS_OPENMP && USE_OPENMP @@ -101,6 +100,12 @@ namespace netlist #endif } + void retime(const Time t, const Element &elem) NOEXCEPT + { + remove(elem); + push(t, elem); + } + void clear() { m_end = &m_list[0]; diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index b311e4b1a68..72fdac657d9 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -110,7 +110,7 @@ void setup_t::register_dev(plib::owned_ptr dev) void setup_t::register_lib_entry(const pstring &name) { - if (m_lib.contains(name)) + if (plib::container::contains(m_lib, name)) log().warning("Lib entry collection already contains {1}. IGNORED", name); else m_lib.push_back(name); @@ -118,7 +118,7 @@ void setup_t::register_lib_entry(const pstring &name) void setup_t::register_dev(const pstring &classname, const pstring &name) { - if (m_lib.contains(classname)) + if (plib::container::contains(m_lib, classname)) { namespace_push(name); include(classname); @@ -151,13 +151,13 @@ void setup_t::register_model(const pstring &model_in) log().fatal("Unable to parse model: {1}", model_in); pstring model = model_in.left(pos).trim().ucase(); pstring def = model_in.substr(pos + 1).trim(); - if (!m_models.add(model, def)) + if (!m_models.insert({model, def}).second) log().fatal("Model already exists: {1}", model_in); } void setup_t::register_alias_nofqn(const pstring &alias, const pstring &out) { - if (!m_alias.add(alias, out)) + if (!m_alias.insert({alias, out}).second) log().fatal("Error adding alias {1} to alias list\n", alias); } @@ -207,9 +207,10 @@ pstring setup_t::objtype_as_str(object_t &in) const void setup_t::register_and_set_param(pstring name, param_t ¶m) { - if (m_param_values.contains(name)) + auto i = m_param_values.find(name); + if (i != m_param_values.end()) { - const pstring val = m_param_values[name]; + const pstring val = i->second; log().debug("Found parameter ... {1} : {1}\n", name, val); switch (param.param_type()) { @@ -240,24 +241,13 @@ void setup_t::register_and_set_param(pstring name, param_t ¶m) log().fatal("Parameter is not supported {1} : {2}\n", name, val); } } - if (!m_params.add(param.name(), param_ref_t(param.name(), param.device(), param))) + if (!m_params.insert({param.name(), param_ref_t(param.name(), param.device(), param)}).second) log().fatal("Error adding parameter {1} to parameter list\n", name); } void setup_t::register_term(core_terminal_t &term) { - if (term.is_type(terminal_t::OUTPUT)) - { - } - else if (term.is_type(terminal_t::INPUT)) - { - static_cast(term.device()).m_terminals.push_back(term.name()); - } - else - { - static_cast(term.device()).m_terminals.push_back(term.name()); - } - if (!m_terminals.add(term.name(), &term)) + if (!m_terminals.insert({term.name(), &term}).second) log().fatal("Error adding {1} {2} to terminal list\n", objtype_as_str(term), term.name()); log().debug("{1} {2}\n", objtype_as_str(term), term.name()); } @@ -291,15 +281,16 @@ void setup_t::remove_connections(const pstring pin) pstring pinfn = build_fqn(pin); bool found = false; - for (int i = m_links.size() - 1; i >= 0; i--) + for (auto link = m_links.begin(); link != m_links.end(); ) { - auto &link = m_links[i]; - if ((link.first == pinfn) || (link.second == pinfn)) + if ((link->first == pinfn) || (link->second == pinfn)) { - log().verbose("removing connection: {1} <==> {2}\n", link.first, link.second); - m_links.remove_at(i); + log().verbose("removing connection: {1} <==> {2}\n", link->first, link->second); + link = m_links.erase(link); found = true; } + else + link++; } if (!found) log().fatal("remove_connections: found no occurrence of {1}\n", pin); @@ -345,15 +336,15 @@ void setup_t::register_param(const pstring ¶m, const pstring &value) { pstring fqn = build_fqn(param); - int idx = m_param_values.index_of(fqn); - if (idx < 0) + auto idx = m_param_values.find(fqn); + if (idx == m_param_values.end()) { - if (!m_param_values.add(fqn, value)) + if (!m_param_values.insert({fqn, value}).second) log().fatal("Unexpected error adding parameter {1} to parameter list\n", param); } else { - log().warning("Overwriting {1} old <{2}> new <{3}>\n", fqn, m_param_values.value_at(idx), value); + log().warning("Overwriting {1} old <{2}> new <{3}>\n", fqn, idx->second, value); m_param_values[fqn] = value; } } @@ -366,8 +357,8 @@ const pstring setup_t::resolve_alias(const pstring &name) const /* FIXME: Detect endless loop */ do { ret = temp; - int p = m_alias.index_of(ret); - temp = (p>=0 ? m_alias.value_at(p) : ""); + auto p = m_alias.find(ret); + temp = (p != m_alias.end() ? p->second : ""); } while (temp != ""); log().debug("{1}==>{2}\n", name, ret); @@ -377,17 +368,15 @@ const pstring setup_t::resolve_alias(const pstring &name) const core_terminal_t *setup_t::find_terminal(const pstring &terminal_in, bool required) { const pstring &tname = resolve_alias(terminal_in); - int ret; - - ret = m_terminals.index_of(tname); + auto ret = m_terminals.find(tname); /* look for default */ - if (ret < 0) + if (ret == m_terminals.end()) { /* look for ".Q" std output */ - ret = m_terminals.index_of(tname + ".Q"); + ret = m_terminals.find(tname + ".Q"); } - core_terminal_t *term = (ret < 0 ? nullptr : m_terminals.value_at(ret)); + core_terminal_t *term = (ret == m_terminals.end() ? nullptr : ret->second); if (term == nullptr && required) log().fatal("terminal {1}({2}) not found!\n", terminal_in, tname); @@ -399,19 +388,17 @@ core_terminal_t *setup_t::find_terminal(const pstring &terminal_in, bool require core_terminal_t *setup_t::find_terminal(const pstring &terminal_in, object_t::type_t atype, bool required) { const pstring &tname = resolve_alias(terminal_in); - int ret; - - ret = m_terminals.index_of(tname); + auto ret = m_terminals.find(tname); /* look for default */ - if (ret < 0 && atype == object_t::OUTPUT) + if (ret == m_terminals.end() && atype == object_t::OUTPUT) { /* look for ".Q" std output */ - ret = m_terminals.index_of(tname + ".Q"); + ret = m_terminals.find(tname + ".Q"); } - if (ret < 0 && required) + if (ret == m_terminals.end() && required) log().fatal("terminal {1}({2}) not found!\n", terminal_in, tname); - core_terminal_t *term = (ret < 0 ? nullptr : m_terminals.value_at(ret)); + core_terminal_t *term = (ret == m_terminals.end() ? nullptr : ret->second); if (term != nullptr && term->type() != atype) { @@ -431,14 +418,12 @@ param_t *setup_t::find_param(const pstring ¶m_in, bool required) const pstring param_in_fqn = build_fqn(param_in); const pstring &outname = resolve_alias(param_in_fqn); - int ret; - - ret = m_params.index_of(outname); - if (ret < 0 && required) + auto ret = m_params.find(outname); + if (ret == m_params.end() && required) log().fatal("parameter {1}({2}) not found!\n", param_in_fqn, outname); - if (ret != -1) + if (ret != m_params.end()) log().debug("Found parameter {1}\n", outname); - return (ret == -1 ? nullptr : &m_params.value_at(ret).m_param); + return (ret == m_params.end() ? nullptr : &ret->second.m_param); } // FIXME avoid dynamic cast here @@ -588,7 +573,7 @@ void setup_t::connect_terminals(core_terminal_t &t1, core_terminal_t &t2) { log().debug("adding analog net ...\n"); // FIXME: Nets should have a unique name - analog_net_t::ptr_t anet = plib::palloc(netlist(),"net." + t1.name()); + auto anet = plib::palloc(netlist(),"net." + t1.name()); t1.set_net(anet); anet->register_con(t2); anet->register_con(t1); @@ -706,16 +691,16 @@ void setup_t::resolve_inputs() int tries = 100; while (m_links.size() > 0 && tries > 0) // FIXME: convert into constant { - unsigned li = 0; - while (li < m_links.size()) + auto li = m_links.begin(); + while (li != m_links.end()) { - const pstring t1s = m_links[li].first; - const pstring t2s = m_links[li].second; + const pstring t1s = li->first; + const pstring t2s = li->second; core_terminal_t *t1 = find_terminal(t1s); core_terminal_t *t2 = find_terminal(t2s); if (connect(*t1, *t2)) - m_links.remove_at(li); + li = m_links.erase(li); else li++; } @@ -733,28 +718,23 @@ void setup_t::resolve_inputs() // delete empty nets ... and save m_list ... - net_t::list_t todelete; - - for (auto & net : netlist().m_nets) + for (auto net = netlist().m_nets.begin(); net != netlist().m_nets.end();) { - if (net->num_cons() == 0) - todelete.push_back(net); + if (net->get()->num_cons() == 0) + { + log().verbose("Deleting net {1} ...", net->get()->name()); + net = netlist().m_nets.erase(net); + } else - net->rebuild_list(); - } - - for (auto & net : todelete) - { - log().verbose("Deleting net {1} ...", net->name()); - netlist().m_nets.remove(net); + ++net; } pstring errstr(""); log().verbose("looking for terminals not connected ..."); - for (std::size_t i = 0; i < m_terminals.size(); i++) + for (auto & i : m_terminals) { - core_terminal_t *term = m_terminals.value_at(i); + core_terminal_t *term = i.second; if (!term->has_net() && dynamic_cast< devices::NETLIB_NAME(dummy_input) *>(&term->device()) != nullptr) log().warning("Found dummy terminal {1} without connections", term->name()); else if (!term->has_net()) @@ -862,13 +842,12 @@ const logic_family_desc_t *setup_t::family_from_model(const pstring &model) static pstring model_string(model_map_t &map) { pstring ret = map["COREMODEL"] + "("; - for (unsigned i=0; i= 0) break; key = model.ucase(); - if (!m_models.contains(key)) + auto i = m_models.find(key); + if (i == m_models.end()) log().fatal("Model {1} not found\n", model); - model = m_models[key]; + model = i->second; } pstring xmodel = model.left(pos); @@ -891,7 +871,8 @@ void setup_t::model_parse(const pstring &model_in, model_map_t &map) map["COREMODEL"] = key; else { - if (m_models.contains(xmodel)) + auto i = m_models.find(xmodel); + if (i != m_models.end()) model_parse(xmodel, map); else log().fatal("Model doesn't exist: <{1}>\n", model_in); @@ -918,7 +899,7 @@ const pstring setup_t::model_value_str(model_map_t &map, const pstring &entity) if (entity != entity.ucase()) log().fatal("model parameters should be uppercase:{1} {2}\n", entity, model_string(map)); - if (!map.contains(entity)) + if (map.find(entity) == map.end()) log().fatal("Entity {1} not found in model {2}\n", entity, model_string(map)); else ret = map[entity]; diff --git a/src/lib/netlist/nl_setup.h b/src/lib/netlist/nl_setup.h index ebf989cb20f..109f58fb43b 100644 --- a/src/lib/netlist/nl_setup.h +++ b/src/lib/netlist/nl_setup.h @@ -10,6 +10,8 @@ #include #include +#include + #include "nl_base.h" #include "nl_factory.h" @@ -91,7 +93,7 @@ namespace netlist class source_t { public: - using list_t = plib::pvector_t>; + using list_t = std::vector>; source_t() {} @@ -167,7 +169,7 @@ namespace netlist factory_list_t &factory() { return m_factory; } const factory_list_t &factory() const { return m_factory; } - bool is_library_item(const pstring &name) const { return m_lib.contains(name); } + bool is_library_item(const pstring &name) const { return plib::container::contains(m_lib, name); } /* model / family related */ @@ -180,7 +182,7 @@ namespace netlist plib::plog_base &log() { return netlist().log(); } const plib::plog_base &log() const { return netlist().log(); } - plib::pvector_t> m_device_factory; + std::vector> m_device_factory; protected: @@ -203,23 +205,25 @@ namespace netlist netlist_t &m_netlist; - plib::hashmap_t m_alias; - plib::hashmap_t m_params; - plib::hashmap_t m_param_values; - plib::hashmap_t m_terminals; + public: + std::unordered_map m_alias; + std::unordered_map m_params; + std::unordered_map m_param_values; + std::unordered_map m_terminals; + private: - plib::pvector_t m_links; + std::vector m_links; factory_list_t m_factory; - plib::hashmap_t m_models; + std::unordered_map m_models; int m_proxy_cnt; int m_frontier_cnt; std::stack m_namespace_stack; source_t::list_t m_sources; - plib::pvector_t m_lib; + std::vector m_lib; }; diff --git a/src/lib/netlist/nl_time.h b/src/lib/netlist/nl_time.h index ed28cedc932..9330526018f 100644 --- a/src/lib/netlist/nl_time.h +++ b/src/lib/netlist/nl_time.h @@ -31,10 +31,8 @@ namespace netlist #if (PHAS_INT128) using INTERNALTYPE = UINT128; - static const pstate_data_type_e STATETYPE = DT_INT128; #else using INTERNALTYPE = UINT64; - static constexpr pstate_data_type_e STATETYPE = pstate_data_type_e::DT_INT64; #endif static constexpr INTERNALTYPE RESOLUTION = NETLIST_INTERNAL_RES; @@ -47,7 +45,6 @@ namespace netlist constexpr explicit netlist_time(const INTERNALTYPE nom, const INTERNALTYPE den) : m_time(nom * (RESOLUTION / den)) { } - netlist_time &operator=(const netlist_time rhs) { m_time = rhs.m_time; return *this; } netlist_time &operator+=(const netlist_time &rhs) { m_time += rhs.m_time; return *this; } @@ -125,14 +122,12 @@ namespace netlist INTERNALTYPE m_time; }; - - } namespace plib { -template<> inline void pstate_manager_t::save_item(const void *owner, netlist::netlist_time &nlt, const pstring &stname) +template<> inline void state_manager_t::save_item(const void *owner, netlist::netlist_time &nlt, const pstring &stname) { - save_state_ptr(owner, stname, netlist::netlist_time::STATETYPE, sizeof(netlist::netlist_time::INTERNALTYPE), 1, nlt.get_internaltype_ptr(), false); + save_state_ptr(owner, stname, datatype_t(sizeof(netlist::netlist_time::INTERNALTYPE), false, true, false), 1, nlt.get_internaltype_ptr()); } } diff --git a/src/lib/netlist/plib/plists.h b/src/lib/netlist/plib/plists.h index 66b48e3ab94..030b172f50e 100644 --- a/src/lib/netlist/plib/plists.h +++ b/src/lib/netlist/plib/plists.h @@ -14,8 +14,6 @@ #include #include #include -//#include -//#include #include "palloc.h" #include "pstring.h" @@ -71,48 +69,6 @@ private: typename std::aligned_storage::type m_buf[N]; }; -// ---------------------------------------------------------------------------------------- -// plist_t: a simple list -// ---------------------------------------------------------------------------------------- - -template -class pvector_t : public std::vector -{ -public: - pvector_t() : std::vector() {} - - bool contains(const LC &elem) const - { - return (std::find(this->begin(), this->end(), elem) != this->end()); - } - - void remove(const LC &elem) - { - this->erase(std::remove(this->begin(), this->end(), elem), this->end()); - } - - void insert_at(const std::size_t index, const LC &elem) - { - this->insert(this->begin() + index, elem); - } - - void remove_at(const std::size_t pos) - { - this->erase(this->begin() + pos); - } - - int indexof(const LC &elem) const - { - for (std::size_t i = 0; i < this->size(); i++) - { - if (this->at(i) == elem) - return i; - } - return -1; - } - -}; - // ---------------------------------------------------------------------------------------- // plinkedlist_t: a simple linked list // the list allows insertions / deletions if used properly @@ -187,249 +143,10 @@ public: void clear() { m_head = nullptr; } bool empty() const { return (m_head == nullptr); } -//private: +private: LC *m_head; }; - -// ---------------------------------------------------------------------------------------- -// hashmap list -// ---------------------------------------------------------------------------------------- - - -template -struct hash_functor -{ - hash_functor() - : m_hash(0) - {} - hash_functor(const C &v) - : m_hash(v) - { - } - friend unsigned operator%(const hash_functor &lhs, const unsigned &rhs) { return lhs.m_hash % rhs; } - bool operator==(const hash_functor &lhs) const { return (m_hash == lhs.m_hash); } -private: - unsigned m_hash; -}; - -template <> -struct hash_functor -{ - hash_functor() - : m_hash(0) - {} - hash_functor(const pstring &v) - { - /* modified djb2 */ - const pstring::mem_t *string = v.cstr(); - unsigned result = 5381; - for (pstring::mem_t c = *string; c != 0; c = *string++) - result = ((result << 5) + result ) ^ (result >> (32 - 5)) ^ c; - //result = (result*33) ^ c; - m_hash = result; - } - friend unsigned operator%(const hash_functor &lhs, const unsigned &rhs) { return lhs.m_hash % rhs; } - unsigned operator()() { return m_hash; } - bool operator==(const hash_functor &lhs) const { return (m_hash == lhs.m_hash); } -private: - unsigned m_hash; -}; - -#if 0 -#if 0 - unsigned hash(const pstring &v) const - { - /* Fowler???Noll???Vo hash - FNV-1 */ - const char *string = v.cstr(); - unsigned result = 2166136261; - for (UINT8 c = *string++; c != 0; c = *string++) - result = (result * 16777619) ^ c; - // result = (result ^ c) * 16777619; FNV 1a - return result; - } -#else - unsigned hash(const pstring &v) const - { - /* jenkins one at a time algo */ - unsigned result = 0; - const char *string = v.cstr(); - while (*string) - { - result += *string; - string++; - result += (result << 10); - result ^= (result >> 6); - } - result += (result << 3); - result ^= (result >> 11); - result += (result << 15); - return result; - } -#endif -#endif - -template > -class hashmap_t -{ -public: - hashmap_t() : m_hash(37) - { - for (unsigned i=0; i= 0) - cnt++; - const unsigned s = m_values.size(); - if (s>0) - printf("phashmap: %d elements %d hashsize, percent in overflow: %d\n", s, (unsigned) m_hash.size(), (s - cnt) * 100 / s); - else - printf("phashmap: No elements .. \n"); - } -#endif - m_values.clear(); - for (unsigned i=0; i= 0); - } - - int index_of(const K &key) const - { - return get_idx(key); - } - - unsigned size() const { return m_values.size(); } - - bool add(const K &key, const V &value) - { - /* - * we are using the Euler prime function here - * - * n * n + n + 41 | 40 >= n >=0 - * - * and accept that outside we will not have a prime - * - */ - if (m_values.size() * 3 / 2 > m_hash.size()) - { - unsigned n = std::sqrt( 2 * m_hash.size()); - n = n * n + n + 41; - m_hash.resize(n); - rebuild(); - } - const H hash(key); - const unsigned pos = hash % m_hash.size(); - if (m_hash[pos] == -1) - { - unsigned vpos = m_values.size(); - m_values.push_back(element_t(key, hash, value)); - m_hash[pos] = vpos; - } - else - { - int ep = m_hash[pos]; - - for (; ep != -1; ep = m_values[ep].m_next) - { - if (m_values[ep].m_hash == hash && m_values[ep].m_key == key ) - return false; /* duplicate */ - } - unsigned vpos = m_values.size(); - m_values.push_back(element_t(key, hash, value)); - m_values[vpos].m_next = m_hash[pos]; - m_hash[pos] = vpos; - } - return true; - } - - V& operator[](const K &key) - { - int p = get_idx(key); - if (p == -1) - { - p = m_values.size(); - add(key, V()); - } - return m_values[p].m_value; - } - - V& value_at(const unsigned pos) { return m_values[pos].m_value; } - const V& value_at(const unsigned pos) const { return m_values[pos].m_value; } - - V& key_at(const unsigned pos) { return m_values[pos].m_key; } -private: - - int get_idx(const K &key) const - { - H hash(key); - const unsigned pos = hash % m_hash.size(); - - for (int ep = m_hash[pos]; ep != -1; ep = m_values[ep].m_next) - if (m_values[ep].m_hash == hash && m_values[ep].m_key == key ) - return ep; - return -1; - } - - void rebuild() - { - for (unsigned i=0; i m_values; - std::vector m_hash; -}; - -// ---------------------------------------------------------------------------------------- -// sort a list ... slow, I am lazy -// elements must support ">" operator. -// ---------------------------------------------------------------------------------------- - -template -static inline void sort_list(T &sl) -{ - for(unsigned i = 0; i < sl.size(); i++) - { - for(unsigned j = i + 1; j < sl.size(); j++) - if(sl[i] > sl[j]) - std::swap(sl[i], sl[j]); - - } -} - } #endif /* PLISTS_H_ */ diff --git a/src/lib/netlist/plib/poptions.h b/src/lib/netlist/plib/poptions.h index 8a66000053c..3ab1adb78c6 100644 --- a/src/lib/netlist/plib/poptions.h +++ b/src/lib/netlist/plib/poptions.h @@ -71,7 +71,7 @@ public: virtual int parse(pstring argument) override { - if (m_limit.contains(argument)) + if (plib::container::contains(m_limit, argument)) { m_val = argument; return 0; @@ -224,7 +224,7 @@ private: return nullptr; } - pvector_t