diff options
-rw-r--r-- | src/lib/netlist/analog/nlid_fourterm.h | 15 | ||||
-rw-r--r-- | src/lib/netlist/core/analog.h | 3 | ||||
-rw-r--r-- | src/lib/netlist/core/setup.h | 18 | ||||
-rw-r--r-- | src/lib/netlist/nl_base.cpp | 12 | ||||
-rw-r--r-- | src/lib/netlist/nl_setup.cpp | 4 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_solver.cpp | 12 | ||||
-rw-r--r-- | src/mame/audio/nl_astrob.cpp | 1 |
7 files changed, 48 insertions, 17 deletions
diff --git a/src/lib/netlist/analog/nlid_fourterm.h b/src/lib/netlist/analog/nlid_fourterm.h index 02ca5a9563b..8656cf7e32f 100644 --- a/src/lib/netlist/analog/nlid_fourterm.h +++ b/src/lib/netlist/analog/nlid_fourterm.h @@ -39,16 +39,20 @@ namespace analog { NETLIB_CONSTRUCTOR_EX(VCCS, nl_fptype ri = nlconst::magic(1e9)) , m_G(*this, "G", nlconst::one()) , m_RI(*this, "RI", ri) - , m_OP(*this, "OP", &m_IP, NETLIB_DELEGATE(termhandler)) - , m_ON(*this, "ON", &m_IP, NETLIB_DELEGATE(termhandler)) - , m_IP(*this, "IP", &m_IN, NETLIB_DELEGATE(termhandler)) // <= this should be NULL and terminal be filtered out prior to solving... - , m_IN(*this, "IN", &m_IP, NETLIB_DELEGATE(termhandler)) // <= this should be NULL and terminal be filtered out prior to solving... + , m_OP(*this, "OP", &m_IP, {&m_ON, &m_IN}, NETLIB_DELEGATE(termhandler)) + , m_ON(*this, "ON", &m_IP, {&m_OP, &m_IN}, NETLIB_DELEGATE(termhandler)) + , m_IP(*this, "IP", &m_IN, {&m_OP, &m_ON}, NETLIB_DELEGATE(termhandler)) + , m_IN(*this, "IN", &m_IP, {&m_OP, &m_ON}, NETLIB_DELEGATE(termhandler)) , m_OP1(*this, "_OP1", &m_IN, NETLIB_DELEGATE(termhandler)) , m_ON1(*this, "_ON1", &m_IN, NETLIB_DELEGATE(termhandler)) + //, m_IPx(*this, "_IPx", &m_OP, NETLIB_DELEGATE(termhandler)) // <= this should be NULL and terminal be filtered out prior to solving... + //, m_INx(*this, "_INx", &m_ON, NETLIB_DELEGATE(termhandler)) // <= this should be NULL and terminal be filtered out prior to solving... , m_gfac(nlconst::one()) { connect(m_OP, m_OP1); connect(m_ON, m_ON1); + //connect(m_IP, m_IPx); + //connect(m_IN, m_INx); } NETLIB_RESETI(); @@ -82,6 +86,9 @@ namespace analog { terminal_t m_OP1; terminal_t m_ON1; + //terminal_t m_IPx; + //terminal_t m_INx; + private: nl_fptype m_gfac; }; diff --git a/src/lib/netlist/core/analog.h b/src/lib/netlist/core/analog.h index 4bc986f48fc..d6f217210c4 100644 --- a/src/lib/netlist/core/analog.h +++ b/src/lib/netlist/core/analog.h @@ -61,6 +61,9 @@ namespace netlist /// @param otherterm pointer to the sibling terminal terminal_t(core_device_t &dev, const pstring &aname, terminal_t *otherterm, nldelegate delegate); + terminal_t(core_device_t &dev, const pstring &aname, terminal_t *otherterm, + const std::array<terminal_t *, 2> &splitterterms, nldelegate delegate); + /// \brief Returns voltage of connected net /// /// @return voltage of net this terminal is connected to diff --git a/src/lib/netlist/core/setup.h b/src/lib/netlist/core/setup.h index 8b8a49dbc34..ba783c52130 100644 --- a/src/lib/netlist/core/setup.h +++ b/src/lib/netlist/core/setup.h @@ -144,13 +144,21 @@ namespace netlist pstring get_initial_param_val(const pstring &name, const pstring &def) const; void register_term(detail::core_terminal_t &term); - void register_term(terminal_t &term, terminal_t &other_term); + void register_term(terminal_t &term, terminal_t *other_term, const std::array<terminal_t *, 2> &splitter_terms); - // called from net_splitter + // called from matrix_solver_t::get_connected_net + // returns the terminal being part of a two terminal device. terminal_t *get_connected_terminal(const terminal_t &term) const noexcept { auto ret(m_connected_terminals.find(&term)); - return (ret != m_connected_terminals.end()) ? ret->second : nullptr; + return (ret != m_connected_terminals.end()) ? ret->second[0] : nullptr; + } + + // called from net_splitter + const std::array<terminal_t *, 4> *get_connected_terminals(const terminal_t &term) const noexcept + { + auto ret(m_connected_terminals.find(&term)); + return (ret != m_connected_terminals.end()) ? &ret->second : nullptr; } // get family -> truthtable @@ -223,7 +231,9 @@ namespace netlist // FIXME: can be cleared before run std::unordered_map<pstring, detail::core_terminal_t *> m_terminals; - std::unordered_map<const terminal_t *, terminal_t *> m_connected_terminals; + // FIXME: Limited to 3 additional terminals + std::unordered_map<const terminal_t *, + std::array<terminal_t *, 4>> m_connected_terminals; std::unordered_map<pstring, param_ref_t> m_params; std::unordered_map<const detail::core_terminal_t *, devices::nld_base_proxy *> m_proxies; diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 7e0e5f0425f..52cad23e9ba 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -703,13 +703,21 @@ namespace netlist // terminal_t // ---------------------------------------------------------------------------------------- - terminal_t::terminal_t(core_device_t &dev, const pstring &aname, terminal_t *otherterm, nldelegate delegate) + terminal_t::terminal_t(core_device_t &dev, const pstring &aname, + terminal_t *otherterm, nldelegate delegate) + : terminal_t(dev, aname, otherterm, { nullptr, nullptr }, delegate) + { + } + + terminal_t::terminal_t(core_device_t &dev, const pstring &aname, + terminal_t *otherterm, const std::array<terminal_t *, 2> &splitterterms, + nldelegate delegate) : analog_t(dev, aname, STATE_BIDIR, delegate) , m_Idr(nullptr) , m_go(nullptr) , m_gt(nullptr) { - state().setup().register_term(*this, *otherterm); + state().setup().register_term(*this, otherterm, splitterterms); } void terminal_t::set_ptrs(nl_fptype *gt, nl_fptype *go, nl_fptype *Idr) noexcept(false) diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index 3a4a952841e..09c84642c75 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -552,10 +552,10 @@ void setup_t::register_term(detail::core_terminal_t &term) } } -void setup_t::register_term(terminal_t &term, terminal_t &other_term) +void setup_t::register_term(terminal_t &term, terminal_t *other_term, const std::array<terminal_t *, 2> &splitter_terms) { this->register_term(term); - m_connected_terminals.insert({&term, &other_term}); + m_connected_terminals.insert({&term, {other_term, splitter_terms[0], splitter_terms[1], nullptr}}); } void setup_t::register_param_t(param_t ¶m) diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp index 9f152369001..09a43178e55 100644 --- a/src/lib/netlist/solver/nld_solver.cpp +++ b/src/lib/netlist/solver/nld_solver.cpp @@ -361,10 +361,14 @@ namespace devices { auto &pt = dynamic_cast<terminal_t &>(*term); // check the connected terminal - analog_net_t &connected_net = netlist.setup().get_connected_terminal(pt)->net(); - netlist.log().verbose(" Connected net {}", connected_net.name()); - if (!check_if_processed_and_join(connected_net)) - process_net(netlist, connected_net); + auto connected_terminals = netlist.setup().get_connected_terminals(pt); + for (auto ct = connected_terminals->begin(); *ct != nullptr; ct++) + { + analog_net_t &connected_net = (*ct)->net(); + netlist.log().verbose(" Connected net {}", connected_net.name()); + if (!check_if_processed_and_join(connected_net)) + process_net(netlist, connected_net); + } } } } diff --git a/src/mame/audio/nl_astrob.cpp b/src/mame/audio/nl_astrob.cpp index e4718888a4b..9633191499a 100644 --- a/src/mame/audio/nl_astrob.cpp +++ b/src/mame/audio/nl_astrob.cpp @@ -1201,7 +1201,6 @@ NETLIST_START(astrob) // // Unconnected outputs // - NET_C(GND, U7.7, U7.14) // avoid singular matrices #if (ENABLE_FRONTIERS) #define RXX 192 |