diff options
24 files changed, 262 insertions, 284 deletions
diff --git a/nl_examples/kidniki.c b/nl_examples/kidniki.c index 8914317e7cb..ba53fb3867b 100644 --- a/nl_examples/kidniki.c +++ b/nl_examples/kidniki.c @@ -4,22 +4,27 @@ #include "netlist/devices/nld_system.h" #include "netlist/analog/nld_bjt.h" -#define USE_FRONTIERS 0 -#define USE_FIXED_STV 0 +#define USE_FRONTIERS 1 +#define USE_FIXED_STV 1 NETLIST_START(dummy) +#if (USE_FRONTIERS) + SOLVER(Solver, 18000) + PARAM(Solver.ACCURACY, 1e-8) + PARAM(Solver.NR_LOOPS, 300) + PARAM(Solver.GS_LOOPS, 1) + PARAM(Solver.GS_THRESHOLD, 6) + PARAM(Solver.ITERATIVE, "SOR") + PARAM(Solver.PARALLEL, 0) + PARAM(Solver.SOR_FACTOR, 1.00) +#else SOLVER(Solver, 12000) - PARAM(Solver.ACCURACY, 1e-7) + PARAM(Solver.ACCURACY, 1e-8) PARAM(Solver.NR_LOOPS, 300) - PARAM(Solver.GS_LOOPS, 23) - //PARAM(Solver.GS_THRESHOLD, 99) // Force Gaussian elimination here - PARAM(Solver.SOR_FACTOR, 1.05) + PARAM(Solver.GS_LOOPS, 20) PARAM(Solver.ITERATIVE, "GMRES") - #if 0 - //PARAM(Solver.SOR_FACTOR, 1) - PARAM(Solver.DYNAMIC_TS, 1) - PARAM(Solver.LTE, 1e-1) - #endif + PARAM(Solver.PARALLEL, 0) +#endif //FIXME proper models! //NET_MODEL("2SC945 NPN(Is=2.04f Xti=3 Eg=1.11 Vaf=6 Bf=400 Ikf=20m Xtb=1.5 Br=3.377 Rc=1 Cjc=1p Mjc=.3333 Vjc=.75 Fc=.5 Cje=25p Mje=.3333 Vje=.75 Tr=450n Tf=20n Itf=0 Vtf=0 Xtf=0 VCEO=45V ICrating=150M MFG=Toshiba)") //NET_MODEL("1S1588 D(Is=2.52n Rs=.568 N=1.752 Cjo=4p M=.4 tt=20n Iave=200m Vpk=75 mfg=OnSemi type=silicon)") @@ -70,6 +75,11 @@ NETLIST_START(dummy) OPTIMIZE_FRONTIER(C63.2, RES_K(27), RES_K(1)) OPTIMIZE_FRONTIER(R31.2, RES_K(5.1), 50) OPTIMIZE_FRONTIER(R29.2, RES_K(2.7), 50) + OPTIMIZE_FRONTIER(R87.2, RES_K(68), 50) + + OPTIMIZE_FRONTIER(R50.1, RES_K(2.2), 50) + OPTIMIZE_FRONTIER(R55.1, RES_K(510), 50) + OPTIMIZE_FRONTIER(R84.2, RES_K(50), RES_K(5)) #endif NETLIST_END() diff --git a/scripts/src/netlist.lua b/scripts/src/netlist.lua index 7b2dff521a5..65b8ca29336 100644 --- a/scripts/src/netlist.lua +++ b/scripts/src/netlist.lua @@ -86,8 +86,6 @@ project "netlist" MAME_DIR .. "src/lib/netlist/devices/nld_4020.h", MAME_DIR .. "src/lib/netlist/devices/nld_4066.cpp", MAME_DIR .. "src/lib/netlist/devices/nld_4066.h", - MAME_DIR .. "src/lib/netlist/devices/nld_7400.cpp", - MAME_DIR .. "src/lib/netlist/devices/nld_7400.h", MAME_DIR .. "src/lib/netlist/devices/nld_7402.cpp", MAME_DIR .. "src/lib/netlist/devices/nld_7402.h", MAME_DIR .. "src/lib/netlist/devices/nld_7404.cpp", diff --git a/src/lib/netlist/analog/nld_fourterm.cpp b/src/lib/netlist/analog/nld_fourterm.cpp index d7fd828e1f3..7cba4b15588 100644 --- a/src/lib/netlist/analog/nld_fourterm.cpp +++ b/src/lib/netlist/analog/nld_fourterm.cpp @@ -108,7 +108,7 @@ NETLIB_UPDATE(LVCCS) NETLIB_UPDATE_TERMINALS(LVCCS) { const nl_double m_mult = m_G.Value() * m_gfac; // 1.0 ==> 1V ==> 1A - const nl_double vi = m_IP.net().m_cur_Analog - m_IN.net().m_cur_Analog; + const nl_double vi = m_IP.net().Q_Analog() - m_IN.net().Q_Analog(); if (std::abs(m_mult / m_cur_limit * vi) > 0.5) m_vi = m_vi + 0.2*std::tanh((vi - m_vi)/0.2); diff --git a/src/lib/netlist/analog/nld_twoterm.cpp b/src/lib/netlist/analog/nld_twoterm.cpp index 7c54910612f..819c2c2e11e 100644 --- a/src/lib/netlist/analog/nld_twoterm.cpp +++ b/src/lib/netlist/analog/nld_twoterm.cpp @@ -20,6 +20,8 @@ ATTR_COLD generic_diode::generic_diode() { m_Vd = 0.7; set_param(1e-15, 1, 1e-15); + m_G = m_gmin; + m_Id = 0.0; } ATTR_COLD void generic_diode::set_param(const nl_double Is, const nl_double n, nl_double gmin) diff --git a/src/lib/netlist/devices/net_lib.cpp b/src/lib/netlist/devices/net_lib.cpp index 4df6811dddc..7933bcde988 100644 --- a/src/lib/netlist/devices/net_lib.cpp +++ b/src/lib/netlist/devices/net_lib.cpp @@ -52,6 +52,7 @@ NETLIST_START(family_models) NET_MODEL("OPAMP _()") NET_MODEL("74XXOC FAMILY(IVL=0.8 IVH=2.0 OVL=0.1 OVH=4.95 ORL=10.0 ORH=1.0e8)") + NET_MODEL("74XX FAMILY(TYPE=TTL)") NET_MODEL("CD4XXX FAMILY(TYPE=CD4XXX)") NETLIST_END() @@ -97,7 +98,6 @@ void initialize_factory(factory_list_t &factory) ENTRY(switch2, SWITCH2, "-") ENTRY(nicRSFF, NETDEV_RSFF, "+S,R") ENTRY(nicDelay, NETDEV_DELAY, "-") - ENTRY(7400, TTL_7400_NAND, "+A,B") ENTRY(7402, TTL_7402_NOR, "+A,B") ENTRY(7404, TTL_7404_INVERT, "+A") ENTRY(7408, TTL_7408_AND, "+A,B") @@ -137,7 +137,6 @@ void initialize_factory(factory_list_t &factory) ENTRY(NE555, NE555, "-") ENTRY(r2r_dac, R2R_DAC, "+VIN,R,N") ENTRY(4538_dip, CD4538_DIP, "-") - ENTRY(7400_dip, TTL_7400_DIP, "-") ENTRY(7402_dip, TTL_7402_DIP, "-") ENTRY(7404_dip, TTL_7404_DIP, "-") ENTRY(7408_dip, TTL_7408_DIP, "-") diff --git a/src/lib/netlist/devices/net_lib.h b/src/lib/netlist/devices/net_lib.h index eed3bd6120f..890092e9cee 100644 --- a/src/lib/netlist/devices/net_lib.h +++ b/src/lib/netlist/devices/net_lib.h @@ -17,7 +17,6 @@ #include "nld_4020.h" #include "nld_4066.h" -#include "nld_7400.h" #include "nld_7402.h" #include "nld_7404.h" #include "nld_7408.h" diff --git a/src/lib/netlist/devices/nld_7400.cpp b/src/lib/netlist/devices/nld_7400.cpp deleted file mode 100644 index 188b8ad5529..00000000000 --- a/src/lib/netlist/devices/nld_7400.cpp +++ /dev/null @@ -1,65 +0,0 @@ -// license:GPL-2.0+ -// copyright-holders:Couriersud -/* - * nld_7400.c - * - */ - -#include "nld_7400.h" - -NETLIB_NAMESPACE_DEVICES_START() - -#if (USE_TRUTHTABLE) -nld_7400::truthtable_t nld_7400::m_ttbl; -const char *nld_7400::m_desc[] = { - "A , B | Q ", - "0,X|1|22", - "X,0|1|22", - "1,1|0|15", - "" -}; - -#endif - -NETLIB_START(7400_dip) -{ - register_sub("1", m_1); - register_sub("2", m_2); - register_sub("3", m_3); - register_sub("4", m_4); - - register_subalias("1", m_1.m_I[0]); - register_subalias("2", m_1.m_I[1]); - register_subalias("3", m_1.m_Q[0]); - - register_subalias("4", m_2.m_I[0]); - register_subalias("5", m_2.m_I[1]); - register_subalias("6", m_2.m_Q[0]); - - register_subalias("9", m_3.m_I[0]); - register_subalias("10", m_3.m_I[1]); - register_subalias("8", m_3.m_Q[0]); - - register_subalias("12", m_4.m_I[0]); - register_subalias("13", m_4.m_I[1]); - register_subalias("11", m_4.m_Q[0]); -} - -NETLIB_UPDATE(7400_dip) -{ - /* only called during startup */ - m_1.update_dev(); - m_2.update_dev(); - m_3.update_dev(); - m_4.update_dev(); -} - -NETLIB_RESET(7400_dip) -{ - m_1.do_reset(); - m_2.do_reset(); - m_3.do_reset(); - m_4.do_reset(); -} - -NETLIB_NAMESPACE_DEVICES_END() diff --git a/src/lib/netlist/devices/nld_7400.h b/src/lib/netlist/devices/nld_7400.h deleted file mode 100644 index 97bdda0a912..00000000000 --- a/src/lib/netlist/devices/nld_7400.h +++ /dev/null @@ -1,64 +0,0 @@ -// license:GPL-2.0+ -// copyright-holders:Couriersud -/* - * nld_7400.h - * - * DM7400: Quad 2-Input NAND Gates - * - * +--------------+ - * A1 |1 ++ 14| VCC - * B1 |2 13| B4 - * Y1 |3 12| A4 - * A2 |4 7400 11| Y4 - * B2 |5 10| B3 - * Y2 |6 9| A3 - * GND |7 8| Y3 - * +--------------+ - * __ - * Y = AB - * +---+---++---+ - * | A | B || Y | - * +===+===++===+ - * | 0 | 0 || 1 | - * | 0 | 1 || 1 | - * | 1 | 0 || 1 | - * | 1 | 1 || 0 | - * +---+---++---+ - * - * Naming conventions follow National Semiconductor datasheet - * - */ - -#ifndef NLD_7400_H_ -#define NLD_7400_H_ - -#include "nld_signal.h" -#include "nld_truthtable.h" - -#define TTL_7400_NAND(_name, _A, _B) \ - NET_REGISTER_DEV(TTL_7400_NAND, _name) \ - NET_CONNECT(_name, A, _A) \ - NET_CONNECT(_name, B, _B) - -#define TTL_7400_DIP(_name) \ - NET_REGISTER_DEV(TTL_7400_DIP, _name) - -NETLIB_NAMESPACE_DEVICES_START() - -#if (USE_TRUTHTABLE) -NETLIB_TRUTHTABLE(7400, 2, 1, 0); -#else -NETLIB_SIGNAL(7400, 2, 0, 0); -#endif - -NETLIB_DEVICE(7400_dip, - - NETLIB_NAME(7400) m_1; - NETLIB_NAME(7400) m_2; - NETLIB_NAME(7400) m_3; - NETLIB_NAME(7400) m_4; -); - -NETLIB_NAMESPACE_DEVICES_END() - -#endif /* NLD_7400_H_ */ diff --git a/src/lib/netlist/devices/nld_mm5837.cpp b/src/lib/netlist/devices/nld_mm5837.cpp index 129456c8784..7f7ab6f8660 100644 --- a/src/lib/netlist/devices/nld_mm5837.cpp +++ b/src/lib/netlist/devices/nld_mm5837.cpp @@ -45,7 +45,7 @@ NETLIB_RESET(MM5837_dip) m_RV.set(NL_FCONST(1.0) / R_LOW, 0.0, 0.0); m_shift = 0x1ffff; - m_is_timestep = m_RV.m_P.net().as_analog().solver()->is_timestep(); + m_is_timestep = m_RV.m_P.net().solver()->is_timestep(); } NETLIB_UPDATE(MM5837_dip) diff --git a/src/lib/netlist/devices/nld_system.cpp b/src/lib/netlist/devices/nld_system.cpp index be2ad3718b0..dbf6926437d 100644 --- a/src/lib/netlist/devices/nld_system.cpp +++ b/src/lib/netlist/devices/nld_system.cpp @@ -212,7 +212,7 @@ void nld_d_to_a_proxy::reset() m_Q.initial(0.0); m_last_state = -1; m_RV.do_reset(); - m_is_timestep = m_RV.m_P.net().as_analog().solver()->is_timestep(); + m_is_timestep = m_RV.m_P.net().solver()->is_timestep(); m_RV.set(NL_FCONST(1.0) / logic_family().m_R_low, logic_family().m_low_V, 0.0); } diff --git a/src/lib/netlist/devices/nld_truthtable.h b/src/lib/netlist/devices/nld_truthtable.h index 7619987c8f8..4c53260fdc3 100644 --- a/src/lib/netlist/devices/nld_truthtable.h +++ b/src/lib/netlist/devices/nld_truthtable.h @@ -298,7 +298,7 @@ class netlist_base_factory_truthtable_t : public base_factory_t public: netlist_base_factory_truthtable_t(const pstring &name, const pstring &classname, const pstring &def_param) - : base_factory_t(name, classname, def_param), m_family(netlist_family_TTL) + : base_factory_t(name, classname, def_param), m_family(family_TTL) {} virtual ~netlist_base_factory_truthtable_t() diff --git a/src/lib/netlist/macro/nlm_ttl74xx.cpp b/src/lib/netlist/macro/nlm_ttl74xx.cpp index c06aa2e45d4..de42f26d730 100644 --- a/src/lib/netlist/macro/nlm_ttl74xx.cpp +++ b/src/lib/netlist/macro/nlm_ttl74xx.cpp @@ -9,16 +9,6 @@ * DM7416: Hex Inverting Buffers with * High Voltage Open-Collector Outputs * - * +--------------+ - * A1 |1 ++ 14| VCC - * Y1 |2 13| A6 - * A2 |3 12| Y6 - * Y2 |4 7416 11| A5 - * A3 |5 10| Y5 - * Y3 |6 9| A4 - * GND |7 8| Y4 - * +--------------+ - * */ NETLIST_START(TTL_7416_DIP) @@ -40,11 +30,69 @@ NETLIST_START(TTL_7416_DIP) s3.A, /* A3 |5 10| Y5 */ s5.Q, s3.Q, /* Y3 |6 9| A4 */ s4.A, GND.I, /* GND |7 8| Y4 */ s4.Q - /* +--------------+ */ + /* +--------------+ */ + ) +NETLIST_END() + +/* + * DM7400: Quad 2-Input NAND Gates + * + * __ + * Y = AB + * +---+---++---+ + * | A | B || Y | + * +===+===++===+ + * | 0 | 0 || 1 | + * | 0 | 1 || 1 | + * | 1 | 0 || 1 | + * | 1 | 1 || 0 | + * +---+---++---+ + * + * Naming conventions follow National Semiconductor datasheet + * + */ + +NETLIST_START(TTL_7400_DIP) + TTL_7400_GATE(s1) + TTL_7400_GATE(s2) + TTL_7400_GATE(s3) + TTL_7400_GATE(s4) + + DUMMY_INPUT(GND) + DUMMY_INPUT(VCC) + + DIPPINS( /* +--------------+ */ + s1.A, /* A1 |1 ++ 14| VCC */ VCC.I, + s1.B, /* B1 |2 13| B4 */ s4.B, + s1.Q, /* Y1 |3 12| A4 */ s4.A, + s2.A, /* A2 |4 7400 11| Y4 */ s4.Q, + s2.B, /* B2 |5 10| B3 */ s3.B, + s2.Q, /* Y2 |6 9| A3 */ s3.A, + GND.I, /* GND |7 8| Y3 */ s3.Q + /* +--------------+ */ ) NETLIST_END() NETLIST_START(TTL74XX_lib) + + TRUTHTABLE_START(TTL_7400_GATE, 2, 1, 0, "") + TT_HEAD("A,B|Q ") + TT_LINE("0,X|1|22") + TT_LINE("X,0|1|22") + TT_LINE("1,1|0|15") + /* Open Collector */ + TT_FAMILY("74XX") + TRUTHTABLE_END() + + TRUTHTABLE_START(TTL_7400_NAND, 2, 1, 0, "+A,B") + TT_HEAD("A,B|Q ") + TT_LINE("0,X|1|22") + TT_LINE("X,0|1|22") + TT_LINE("1,1|0|15") + /* Open Collector */ + TT_FAMILY("74XX") + TRUTHTABLE_END() + TRUTHTABLE_START(TTL_7416_GATE, 1, 1, 0, "") TT_HEAD(" A | Q ") TT_LINE(" 0 | 1 |15") @@ -54,4 +102,5 @@ NETLIST_START(TTL74XX_lib) TRUTHTABLE_END() LOCAL_LIB_ENTRY(TTL_7416_DIP) + LOCAL_LIB_ENTRY(TTL_7400_DIP) NETLIST_END() diff --git a/src/lib/netlist/macro/nlm_ttl74xx.h b/src/lib/netlist/macro/nlm_ttl74xx.h index 8ae8819480f..08cbe1bb66d 100644 --- a/src/lib/netlist/macro/nlm_ttl74xx.h +++ b/src/lib/netlist/macro/nlm_ttl74xx.h @@ -11,6 +11,17 @@ * Netlist Macros * ---------------------------------------------------------------------------*/ +#define TTL_7400_GATE(_name) \ + NET_REGISTER_DEV(TTL_7400_GATE, _name) \ + +#define TTL_7400_NAND(_name, _A, _B) \ + NET_REGISTER_DEV(TTL_7400_NAND, _name) \ + NET_CONNECT(_name, A, _A) \ + NET_CONNECT(_name, B, _B) + +#define TTL_7400_DIP(_name) \ + NET_REGISTER_DEV(TTL_7400_DIP, _name) + #define TTL_7416_GATE(_name) \ NET_REGISTER_DEV(TTL_7416_GATE, _name) diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 80f635b3f73..6ea052b4132 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -64,11 +64,11 @@ public: } }; -logic_family_desc_t *netlist_family_TTL = palloc(logic_family_ttl_t); -logic_family_desc_t *netlist_family_CD4XXX = palloc(logic_family_cd4xxx_t); +logic_family_desc_t *family_TTL = palloc(logic_family_ttl_t); +logic_family_desc_t *family_CD4XXX = palloc(logic_family_cd4xxx_t); // ---------------------------------------------------------------------------------------- -// netlist_queue_t +// queue_t // ---------------------------------------------------------------------------------------- queue_t::queue_t(netlist_t &nl) @@ -121,7 +121,7 @@ void queue_t::on_post_load() } // ---------------------------------------------------------------------------------------- -// netlist_object_t +// object_t // ---------------------------------------------------------------------------------------- ATTR_COLD object_t::object_t(const type_t atype, const family_t afamily) @@ -149,7 +149,7 @@ ATTR_COLD const pstring &object_t::name() const } // ---------------------------------------------------------------------------------------- -// netlist_owned_object_t +// device_object_t // ---------------------------------------------------------------------------------------- ATTR_COLD device_object_t::device_object_t(const type_t atype, @@ -167,7 +167,7 @@ ATTR_COLD void device_object_t::init_object(core_device_t &dev, } // ---------------------------------------------------------------------------------------- -// netlist_base_t +// netlist_t // ---------------------------------------------------------------------------------------- netlist_t::netlist_t() @@ -179,6 +179,7 @@ netlist_t::netlist_t() m_mainclock(NULL), m_solver(NULL), m_gnd(NULL), + m_params(NULL), m_setup(NULL), m_log(this) { @@ -425,7 +426,7 @@ ATTR_HOT netlist_sig_t core_device_t::INPLOGIC_PASSIVE(logic_input_t &inp) // ---------------------------------------------------------------------------------------- -// netlist_device_t +// device_t // ---------------------------------------------------------------------------------------- device_t::device_t() @@ -555,7 +556,7 @@ template ATTR_COLD void device_t::register_param(const pstring &sname, param_mod // ---------------------------------------------------------------------------------------- -// netlist_net_t +// net_t // ---------------------------------------------------------------------------------------- ATTR_COLD net_t::net_t(const family_t afamily) @@ -742,7 +743,7 @@ ATTR_COLD void net_t::merge_net(net_t *othernet) // ---------------------------------------------------------------------------------------- -// netlist_logic_net_t +// logic_net_t // ---------------------------------------------------------------------------------------- ATTR_COLD logic_net_t::logic_net_t() @@ -762,7 +763,7 @@ ATTR_COLD void logic_net_t::save_register() } // ---------------------------------------------------------------------------------------- -// netlist_analog_net_t +// analog_net_t // ---------------------------------------------------------------------------------------- ATTR_COLD analog_net_t::analog_net_t() @@ -785,39 +786,39 @@ ATTR_COLD void analog_net_t::save_register() net_t::save_register(); } -ATTR_COLD bool analog_net_t::already_processed(list_t *groups, int cur_group) +ATTR_COLD bool analog_net_t::already_processed(pvector_t<list_t> &groups) { if (isRailNet()) return true; - for (int i = 0; i <= cur_group; i++) + for (auto & grp : groups) { - if (groups[i].contains(this)) + if (grp.contains(this)) return true; } return false; } -ATTR_COLD void analog_net_t::process_net(list_t *groups, int &cur_group) +ATTR_COLD void analog_net_t::process_net(pvector_t<list_t> &groups) { if (num_cons() == 0) return; /* add the net */ - groups[cur_group].push_back(this); + groups.back().push_back(this); for (core_terminal_t *p : m_core_terms) { if (p->isType(terminal_t::TERMINAL)) { terminal_t *pt = static_cast<terminal_t *>(p); - analog_net_t *other_net = &pt->m_otherterm->net().as_analog(); - if (!other_net->already_processed(groups, cur_group)) - other_net->process_net(groups, cur_group); + analog_net_t *other_net = &pt->m_otherterm->net(); + if (!other_net->already_processed(groups)) + other_net->process_net(groups); } } } // ---------------------------------------------------------------------------------------- -// netlist_core_terminal_t +// core_terminal_t // ---------------------------------------------------------------------------------------- ATTR_COLD core_terminal_t::core_terminal_t(const type_t atype, const family_t afamily) @@ -834,11 +835,11 @@ ATTR_COLD void core_terminal_t::set_net(net_t &anet) } // ---------------------------------------------------------------------------------------- -// netlist_terminal_t +// terminal_t // ---------------------------------------------------------------------------------------- ATTR_COLD terminal_t::terminal_t() -: core_terminal_t(TERMINAL, ANALOG) +: analog_t(TERMINAL) , m_Idr1(NULL) , m_go1(NULL) , m_gt1(NULL) @@ -846,18 +847,19 @@ ATTR_COLD terminal_t::terminal_t() { } + ATTR_HOT void terminal_t::schedule_solve() { // FIXME: Remove this after we found a way to remove *ALL* twoterms connected to railnets only. - if (net().as_analog().solver() != NULL) - net().as_analog().solver()->update_forced(); + if (net().solver() != NULL) + net().solver()->update_forced(); } ATTR_HOT void terminal_t::schedule_after(const netlist_time &after) { // FIXME: Remove this after we found a way to remove *ALL* twoterms connected to railnets only. - if (net().as_analog().solver() != NULL) - net().as_analog().solver()->update_after(after); + if (net().solver() != NULL) + net().solver()->update_after(after); } ATTR_COLD void terminal_t::reset() @@ -886,7 +888,7 @@ ATTR_COLD void terminal_t::save_register() // ---------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------- -// netlist_logic_output_t +// logic_output_t // ---------------------------------------------------------------------------------------- ATTR_COLD logic_output_t::logic_output_t() @@ -910,32 +912,32 @@ ATTR_COLD void logic_output_t::initial(const netlist_sig_t val) // ---------------------------------------------------------------------------------------- -// netlist_analog_output_t +// analog_output_t // ---------------------------------------------------------------------------------------- ATTR_COLD analog_output_t::analog_output_t() - : netlist_analog_t(OUTPUT), m_proxied_net(NULL) + : analog_t(OUTPUT), m_proxied_net(NULL) { this->set_net(m_my_net); set_state(STATE_OUT); - net().as_analog().m_cur_Analog = NL_FCONST(0.99); + net().m_cur_Analog = NL_FCONST(0.99); } ATTR_COLD void analog_output_t::init_object(core_device_t &dev, const pstring &aname) { - core_terminal_t::init_object(dev, aname); + analog_t::init_object(dev, aname); net().init_object(dev.netlist(), aname + ".net"); net().register_railterminal(*this); } ATTR_COLD void analog_output_t::initial(const nl_double val) { - net().as_analog().m_cur_Analog = val; + net().m_cur_Analog = val; } // ---------------------------------------------------------------------------------------- -// netlist_param_t & friends +// param_t & friends // ---------------------------------------------------------------------------------------- ATTR_COLD param_t::param_t(const param_type_t atype) diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 72911c9b25c..24f2cde585a 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -253,7 +253,7 @@ typedef unsigned int netlist_sig_t; #define NETLIB_LOGIC_FAMILY(_fam) \ virtual logic_family_desc_t *default_logic_family() override \ { \ - return netlist_family_ ## _fam; \ + return family_ ## _fam; \ } @@ -317,7 +317,7 @@ namespace netlist typedef phashmap_t<pstring, pstring> model_map_t; // ----------------------------------------------------------------------------- - // netlist_output_family_t + // logic_family_t // ----------------------------------------------------------------------------- class logic_family_desc_t @@ -351,7 +351,7 @@ namespace netlist logic_family_desc_t *m_logic_family; }; - /* Terminals inherit the family description from the netlist_device + /* Terminals inherit the family description from the device * The default is the ttl family, but any device can override the family. * For individual terminals, these can be overwritten as well. * @@ -359,12 +359,12 @@ namespace netlist */ - extern logic_family_desc_t *netlist_family_TTL; - extern logic_family_desc_t *netlist_family_CD4XXX; + extern logic_family_desc_t *family_TTL; + extern logic_family_desc_t *family_CD4XXX; // ----------------------------------------------------------------------------- - // netlist_object_t + // object_t // ----------------------------------------------------------------------------- class object_t @@ -443,7 +443,7 @@ namespace netlist }; // ----------------------------------------------------------------------------- - // netlist_owned_object_t + // device_object_t // ----------------------------------------------------------------------------- class device_object_t : public object_t @@ -461,7 +461,7 @@ namespace netlist // ----------------------------------------------------------------------------- - // netlist_core_terminal_t + // core_terminal_t // ----------------------------------------------------------------------------- class core_terminal_t : public device_object_t, public plinkedlist_element_t<core_terminal_t> @@ -485,8 +485,6 @@ namespace netlist ATTR_COLD core_terminal_t(const type_t atype, const family_t afamily); - //ATTR_COLD void init_object(netlist_core_device_t &dev, const pstring &aname); - ATTR_COLD void set_net(net_t &anet); ATTR_COLD void clear_net() { m_net = NULL; } ATTR_HOT bool has_net() const { return (m_net != NULL); } @@ -514,7 +512,37 @@ namespace netlist state_e m_state; }; - class terminal_t : public core_terminal_t + // ----------------------------------------------------------------------------- + // analog_t + // ----------------------------------------------------------------------------- + + class analog_t : public core_terminal_t + { + public: + + + ATTR_COLD analog_t(const type_t atype) + : core_terminal_t(atype, ANALOG) + { + } + + virtual void reset() override + { + } + + ATTR_HOT inline const analog_net_t & net() const; + ATTR_HOT inline analog_net_t & net(); + + protected: + + private: + }; + + // ----------------------------------------------------------------------------- + // terminal_t + // ----------------------------------------------------------------------------- + + class terminal_t : public analog_t { P_PREVENT_COPYING(terminal_t) public: @@ -527,6 +555,8 @@ namespace netlist nl_double *m_go1; // conductance for Voltage from other term nl_double *m_gt1; // conductance for total conductance + terminal_t *m_otherterm; + ATTR_HOT void set(const nl_double G) { set_ptr(m_Idr1, 0); @@ -551,8 +581,6 @@ namespace netlist ATTR_HOT void schedule_solve(); ATTR_HOT void schedule_after(const netlist_time &after); - terminal_t *m_otherterm; - protected: virtual void save_register() override; @@ -569,7 +597,7 @@ namespace netlist // ----------------------------------------------------------------------------- - // netlist_input_t + // logic_t // ----------------------------------------------------------------------------- class logic_t : public core_terminal_t, public logic_family_t @@ -583,6 +611,10 @@ namespace netlist { } + virtual void reset() override + { + } + ATTR_COLD bool has_proxy() const { return (m_proxy != NULL); } ATTR_COLD devices::nld_base_proxy *get_proxy() const { return m_proxy; } ATTR_COLD void set_proxy(devices::nld_base_proxy *proxy) { m_proxy = proxy; } @@ -593,23 +625,8 @@ namespace netlist devices::nld_base_proxy *m_proxy; }; - class netlist_analog_t : public core_terminal_t - { - public: - - - ATTR_COLD netlist_analog_t(const type_t atype) - : core_terminal_t(atype, ANALOG) - { - } - - protected: - - private: - }; - // ----------------------------------------------------------------------------- - // netlist_logic_input_t + // logic_input_t // ----------------------------------------------------------------------------- class logic_input_t : public logic_t @@ -632,21 +649,21 @@ namespace netlist protected: virtual void reset() override { - //netlist_core_terminal_t::reset(); + logic_t::reset(); set_state(STATE_INP_ACTIVE); } }; // ----------------------------------------------------------------------------- - // netlist_analog_input_t + // analog_input_t // ----------------------------------------------------------------------------- - class analog_input_t : public netlist_analog_t + class analog_input_t : public analog_t { public: ATTR_COLD analog_input_t() - : netlist_analog_t(INPUT) + : analog_t(INPUT) { set_state(STATE_INP_ACTIVE); } @@ -656,7 +673,7 @@ namespace netlist protected: virtual void reset() override { - //netlist_core_terminal_t::reset(); + analog_t::reset(); set_state(STATE_INP_ACTIVE); } }; @@ -815,7 +832,7 @@ namespace netlist ATTR_COLD analog_net_t(); virtual ~analog_net_t() { }; - ATTR_HOT nl_double Q_Analog() const + ATTR_HOT const nl_double &Q_Analog() const { return m_cur_Analog; } @@ -827,8 +844,8 @@ namespace netlist ATTR_HOT devices::matrix_solver_t *solver() { return m_solver; } - ATTR_COLD bool already_processed(list_t *groups, int cur_group); - ATTR_COLD void process_net(list_t *groups, int &cur_group); + ATTR_COLD bool already_processed(pvector_t<list_t> &groups); + ATTR_COLD void process_net(pvector_t<list_t> &groups); protected: @@ -874,7 +891,7 @@ namespace netlist logic_net_t m_my_net; }; - class analog_output_t : public netlist_analog_t + class analog_output_t : public analog_t { P_PREVENT_COPYING(analog_output_t) public: @@ -1065,7 +1082,7 @@ namespace netlist virtual void stop() { } \ virtual logic_family_desc_t *default_logic_family() { - return netlist_family_TTL; + return family_TTL; } private: @@ -1128,7 +1145,7 @@ namespace netlist // ----------------------------------------------------------------------------- - // netlist_queue_t + // queue_t // ----------------------------------------------------------------------------- class queue_t : public timed_queue<net_t *, netlist_time>, @@ -1154,7 +1171,7 @@ namespace netlist }; // ----------------------------------------------------------------------------- - // netlist_base_t + // netlist_t // ----------------------------------------------------------------------------- @@ -1245,10 +1262,7 @@ namespace netlist protected: - // any derived netlist must override vlog inherited from plog_base - // virtual void vlog(const plog_level &l, const pstring &ls) = 0; - - /* from netlist_object */ + /* from object */ virtual void reset() override; virtual void save_register() override; @@ -1382,6 +1396,16 @@ namespace netlist } } + ATTR_HOT inline const analog_net_t & analog_t::net() const + { + return core_terminal_t::net().as_analog(); + } + + ATTR_HOT inline analog_net_t & analog_t::net() + { + return core_terminal_t::net().as_analog(); + } + ATTR_HOT inline netlist_sig_t logic_input_t::Q() const { @@ -1395,9 +1419,9 @@ namespace netlist ATTR_HOT inline void analog_output_t::set_Q(const nl_double newQ) { - if (newQ != net().as_analog().m_cur_Analog) + if (newQ != net().Q_Analog()) { - net().as_analog().m_cur_Analog = newQ; + net().m_cur_Analog = newQ; net().push_to_queue(NLTIME_FROM_NS(1)); } } diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index 29bb21cbd66..399fe86d213 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -598,9 +598,6 @@ void setup_t::connect_terminal_output(terminal_t &in, core_terminal_t &out) void setup_t::connect_terminals(core_terminal_t &t1, core_terminal_t &t2) { - //nl_assert(in.isType(netlist_terminal_t::TERMINAL)); - //nl_assert(out.isType(netlist_terminal_t::TERMINAL)); - if (t1.has_net() && t2.has_net()) { log().debug("T2 and T1 have net\n"); @@ -621,7 +618,6 @@ void setup_t::connect_terminals(core_terminal_t &t1, core_terminal_t &t2) log().debug("adding net ...\n"); analog_net_t *anet = palloc(analog_net_t); t1.set_net(*anet); - //m_netlist.solver()->m_nets.add(anet); // FIXME: Nets should have a unique name t1.net().init_object(netlist(),"net." + t1.name() ); t1.net().register_con(t2); @@ -651,8 +647,7 @@ bool setup_t::connect_input_input(core_terminal_t &t1, core_terminal_t &t2) { for (core_terminal_t *t : t1.net().m_core_terms) { - if (t->isType(core_terminal_t::TERMINAL) - /*|| t1.net().m_core_terms[i]->isType(netlist_core_terminal_t::OUTPUT)*/) + if (t->isType(core_terminal_t::TERMINAL)) ret = connect(t2, *t); if (ret) break; @@ -667,8 +662,7 @@ bool setup_t::connect_input_input(core_terminal_t &t1, core_terminal_t &t2) { for (core_terminal_t *t : t2.net().m_core_terms) { - if (t->isType(core_terminal_t::TERMINAL) - /*|| t2.net().m_core_terms[i]->isType(netlist_core_terminal_t::OUTPUT)*/) + if (t->isType(core_terminal_t::TERMINAL)) ret = connect(t1, *t); if (ret) break; @@ -793,11 +787,12 @@ void setup_t::resolve_inputs() for (std::size_t i = 0; i < m_terminals.size(); i++) { core_terminal_t *term = m_terminals.value_at(i); - if (!term->has_net()) + if (!term->has_net() && dynamic_cast< devices::NETLIB_NAME(dummy_input) *>(&term->device()) != NULL) + log().warning("Found dummy terminal {1} without connections", term->name()); + else if (!term->has_net()) errstr += pfmt("Found terminal {1} without a net\n")(term->name()); else if (term->net().num_cons() == 0) - log().warning("Found terminal {1} without connections", - term->name()); + log().warning("Found terminal {1} without connections", term->name()); } if (errstr != "") log().fatal("{1}", errstr); @@ -885,9 +880,9 @@ logic_family_desc_t *setup_t::family_from_model(const pstring &model) model_parse(model, map); if (setup_t::model_value_str(map, "TYPE") == "TTL") - return netlist_family_TTL; + return family_TTL; if (setup_t::model_value_str(map, "TYPE") == "CD4XXX") - return netlist_family_CD4XXX; + return family_CD4XXX; logic_family_std_proxy_t *ret = palloc(logic_family_std_proxy_t); diff --git a/src/lib/netlist/plib/plists.h b/src/lib/netlist/plib/plists.h index d63d4fbe898..f5d395f4628 100644 --- a/src/lib/netlist/plib/plists.h +++ b/src/lib/netlist/plib/plists.h @@ -467,7 +467,6 @@ public: struct element_t { - element_t() { } element_t(const K &key, const H &hash, const V &value) : m_key(key), m_hash(hash), m_value(value), m_next(-1) {} diff --git a/src/lib/netlist/solver/nld_ms_direct.h b/src/lib/netlist/solver/nld_ms_direct.h index ecc3cb19c3d..bdcec31ad44 100644 --- a/src/lib/netlist/solver/nld_ms_direct.h +++ b/src/lib/netlist/solver/nld_ms_direct.h @@ -11,6 +11,7 @@ #include <algorithm> #include "solver/nld_solver.h" +#include "solver/vector_base.h" NETLIB_NAMESPACE_DEVICES_START() @@ -105,7 +106,7 @@ ATTR_HOT nl_double matrix_solver_direct_t<m_N, _storage_N>::compute_next_timeste { analog_net_t *n = m_nets[k]; - const nl_double DD_n = (n->m_cur_Analog - m_last_V[k]); + const nl_double DD_n = (n->Q_Analog() - m_last_V[k]); const nl_double hn = current_timestep(); nl_double DD2 = (DD_n / hn - n->m_DD_n_m_1 / n->m_h_n_m_1) / (hn + n->m_h_n_m_1); @@ -409,8 +410,13 @@ ATTR_HOT void matrix_solver_direct_t<m_N, _storage_N>::LE_solve() const nl_double f1 = - A(j,i) * f; if (f1 != NL_FCONST(0.0)) { - for (unsigned k = i+1; k < kN; k++) - A(j,k) += A(i,k) * f1; + nl_double * RESTRICT pi = &m_A[i][i+1]; + nl_double * RESTRICT pj = &m_A[j][i+1]; + vec_add_mult_scalar(kN-i-1,pj,f1,pi); + //for (unsigned k = i+1; k < kN; k++) + // pj[k] = pj[k] + pi[k] * f1; + //for (unsigned k = i+1; k < kN; k++) + //A(j,k) += A(i,k) * f1; m_RHS[j] += m_RHS[i] * f1; } } @@ -430,10 +436,14 @@ ATTR_HOT void matrix_solver_direct_t<m_N, _storage_N>::LE_solve() { const unsigned j = pb[jb]; const nl_double f1 = - A(j,i) * f; +#if 0 + nl_double * RESTRICT pi = &m_A[i][i+1]; + nl_double * RESTRICT pj = &m_A[j][i+1]; + vec_add_mult_scalar(kN-i-1,pi,f1,pj); +#else for (unsigned k = 0; k < e; k++) - { A(j,p[k]) += A(i,p[k]) * f1; - } +#endif m_RHS[j] += m_RHS[i] * f1; } } @@ -577,6 +587,8 @@ ATTR_HOT inline int matrix_solver_direct_t<m_N, _storage_N>::vsolve_non_dynamic( this->LE_solve(); + this->m_stat_calculations++; + return this->solve_non_dynamic(newton_raphson); } diff --git a/src/lib/netlist/solver/nld_ms_direct1.h b/src/lib/netlist/solver/nld_ms_direct1.h index 3aa79de45da..fe5a439a9db 100644 --- a/src/lib/netlist/solver/nld_ms_direct1.h +++ b/src/lib/netlist/solver/nld_ms_direct1.h @@ -45,7 +45,7 @@ ATTR_HOT inline int matrix_solver_direct1_t::vsolve_non_dynamic(ATTR_UNUSED cons nl_double new_val = m_RHS[0] / A(0,0); - nl_double e = (new_val - net->m_cur_Analog); + nl_double e = (new_val - net->Q_Analog()); nl_double cerr = nl_math::abs(e); net->m_cur_Analog = new_val; diff --git a/src/lib/netlist/solver/nld_ms_direct_lu.h b/src/lib/netlist/solver/nld_ms_direct_lu.h index 5af166cfb84..07b3b9cb568 100644 --- a/src/lib/netlist/solver/nld_ms_direct_lu.h +++ b/src/lib/netlist/solver/nld_ms_direct_lu.h @@ -185,7 +185,7 @@ ATTR_HOT nl_double matrix_solver_direct_t<m_N, _storage_N>::compute_next_timeste { analog_net_t *n = m_nets[k]; - const nl_double DD_n = (n->m_cur_Analog - m_last_V[k]); + const nl_double DD_n = (n->Q_Analog() - m_last_V[k]); const nl_double hn = current_timestep(); nl_double DD2 = (DD_n / hn - n->m_DD_n_m_1 / n->m_h_n_m_1) / (hn + n->m_h_n_m_1); diff --git a/src/lib/netlist/solver/nld_ms_sor.h b/src/lib/netlist/solver/nld_ms_sor.h index 59b1efffca7..556e9fddd7f 100644 --- a/src/lib/netlist/solver/nld_ms_sor.h +++ b/src/lib/netlist/solver/nld_ms_sor.h @@ -135,7 +135,6 @@ ATTR_HOT inline int matrix_solver_SOR_t<m_N, _storage_N>::vsolve_non_dynamic(con /* uncommenting the line below will force dynamic updates every X iterations * althought the system has not converged yet. This is a proof of concept, - * 91glub * */ const bool interleaved_dynamic_updates = false; @@ -168,7 +167,6 @@ ATTR_HOT inline int matrix_solver_SOR_t<m_N, _storage_N>::vsolve_non_dynamic(con } while (resched && ((!interleaved_dynamic_updates && resched_cnt < this->m_params.m_gs_loops) || (interleaved_dynamic_updates && resched_cnt < 5 ))); this->m_iterative_total += resched_cnt; - this->m_stat_calculations++; if (resched && !interleaved_dynamic_updates) { @@ -177,6 +175,8 @@ ATTR_HOT inline int matrix_solver_SOR_t<m_N, _storage_N>::vsolve_non_dynamic(con return matrix_solver_direct_t<m_N, _storage_N>::vsolve_non_dynamic(newton_raphson); } + this->m_stat_calculations++; + if (interleaved_dynamic_updates) { for (unsigned k = 0; k < iN; k++) diff --git a/src/lib/netlist/solver/nld_ms_sor_mat.h b/src/lib/netlist/solver/nld_ms_sor_mat.h index 5ef00ae396c..4312c3039be 100644 --- a/src/lib/netlist/solver/nld_ms_sor_mat.h +++ b/src/lib/netlist/solver/nld_ms_sor_mat.h @@ -95,7 +95,7 @@ ATTR_HOT nl_double matrix_solver_SOR_mat_t<m_N, _storage_N>::vsolve() for (unsigned k = 0; k < this->N(); k++) { const analog_net_t *n = this->m_nets[k]; - const nl_double nv = (n->m_cur_Analog - this->m_last_V[k]) * rez_cts ; + const nl_double nv = (n->Q_Analog() - this->m_last_V[k]) * rez_cts ; sq += nv * nv; sqo += this->m_Vdelta[k] * this->m_Vdelta[k]; this->m_Vdelta[k] = nv; diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp index 761e665f68b..3c8b0f4a663 100644 --- a/src/lib/netlist/solver/nld_solver.cpp +++ b/src/lib/netlist/solver/nld_solver.cpp @@ -12,6 +12,9 @@ #if 0 #pragma GCC optimize "-ffast-math" #pragma GCC optimize "-fstrict-aliasing" +#pragma GCC optimize "-ftree-vectorizer-verbose=2" +#pragma GCC optimize "-fopt-info-vec" +#pragma GCC optimize "-fopt-info-vec-missed" //#pragma GCC optimize "-ftree-parallelize-loops=4" #pragma GCC optimize "-funroll-loops" #pragma GCC optimize "-funswitch-loops" @@ -79,7 +82,7 @@ ATTR_COLD void terms_t::set_pointers() m_term[i]->m_gt1 = &m_gt[i]; m_term[i]->m_go1 = &m_go[i]; m_term[i]->m_Idr1 = &m_Idr[i]; - m_other_curanalog[i] = &m_term[i]->m_otherterm->net().as_analog().m_cur_Analog; + m_other_curanalog[i] = &m_term[i]->m_otherterm->net().m_cur_Analog; } } @@ -188,7 +191,7 @@ ATTR_HOT void matrix_solver_t::update_inputs() { // avoid recursive calls. Inputs are updated outside this call for (std::size_t i=0; i<m_inps.size(); i++) - m_inps[i]->set_Q(m_inps[i]->m_proxied_net->m_cur_Analog); + m_inps[i]->set_Q(m_inps[i]->m_proxied_net->Q_Analog()); } ATTR_HOT void matrix_solver_t::update_dynamic() @@ -304,7 +307,7 @@ ATTR_COLD int matrix_solver_t::get_net_idx(net_t *net) void matrix_solver_t::log_stats() { - if (this->m_stat_calculations != 0 && this->m_params.m_log_stats) + //if (this->m_stat_calculations != 0 && this->m_params.m_log_stats) { log().verbose("=============================================="); log().verbose("Solver {1}", this->name()); @@ -449,7 +452,12 @@ matrix_solver_t * NETLIB_NAME(solver)::create_solver(int size, const bool use_sp { if (pstring("SOR_MAT").equals(m_iterative_solver)) { - typedef matrix_solver_SOR_mat_t<m_N,_storage_N> solver_mat; + typedef matrix_solver_SOR_mat_t<m_N,_storage_N> solver_sor_mat; + return palloc(solver_sor_mat(&m_params, size)); + } + else if (pstring("MAT").equals(m_iterative_solver)) + { + typedef matrix_solver_direct_t<m_N,_storage_N> solver_mat; return palloc(solver_mat(&m_params, size)); } else if (pstring("SOR").equals(m_iterative_solver)) @@ -478,8 +486,7 @@ matrix_solver_t * NETLIB_NAME(solver)::create_solver(int size, const bool use_sp ATTR_COLD void NETLIB_NAME(solver)::post_start() { - analog_net_t::list_t groups[256]; - int cur_group = -1; + pvector_t<analog_net_t::list_t> groups; const bool use_specific = true; m_params.m_pivot = m_pivot.Value(); @@ -519,20 +526,20 @@ ATTR_COLD void NETLIB_NAME(solver)::post_start() { netlist().log().debug(" ==> not a rail net\n"); analog_net_t *n = &net->as_analog(); - if (!n->already_processed(groups, cur_group)) + if (!n->already_processed(groups)) { - cur_group++; - n->process_net(groups, cur_group); + groups.push_back(analog_net_t::list_t()); + n->process_net(groups); } } } // setup the solvers - netlist().log().verbose("Found {1} net groups in {2} nets\n", cur_group + 1, netlist().m_nets.size()); - for (int i = 0; i <= cur_group; i++) + netlist().log().verbose("Found {1} net groups in {2} nets\n", groups.size(), netlist().m_nets.size()); + for (auto & grp : groups) { matrix_solver_t *ms; - std::size_t net_count = groups[i].size(); + std::size_t net_count = grp.size(); switch (net_count) { @@ -613,21 +620,19 @@ ATTR_COLD void NETLIB_NAME(solver)::post_start() register_sub(pfmt("Solver_{1}")(m_mat_solvers.size()), *ms); - ms->vsetup(groups[i]); + ms->vsetup(grp); m_mat_solvers.push_back(ms); netlist().log().verbose("Solver {1}", ms->name()); - netlist().log().verbose(" # {1} ==> {2} nets", i, groups[i].size()); + netlist().log().verbose(" ==> {2} nets", grp.size()); netlist().log().verbose(" has {1} elements", ms->is_dynamic() ? "dynamic" : "no dynamic"); netlist().log().verbose(" has {1} elements", ms->is_timestep() ? "timestep" : "no timestep"); - for (std::size_t j=0; j<groups[i].size(); j++) + for (net_t *n : grp) { - netlist().log().verbose("Net {1}: {2}", j, groups[i][j]->name()); - net_t *n = groups[i][j]; - for (std::size_t k = 0; k < n->m_core_terms.size(); k++) + netlist().log().verbose("Net {1}", n->name()); + for (const core_terminal_t *pcore : n->m_core_terms) { - const core_terminal_t *pcore = n->m_core_terms[k]; netlist().log().verbose(" {1}", pcore->name()); } } diff --git a/src/mame/audio/irem.cpp b/src/mame/audio/irem.cpp index 43cbf08b594..0020c880c30 100644 --- a/src/mame/audio/irem.cpp +++ b/src/mame/audio/irem.cpp @@ -419,7 +419,9 @@ NETLIST_START(kidniki_interface) PARAM(Solver.NR_LOOPS, 300) PARAM(Solver.GS_LOOPS, 1) PARAM(Solver.GS_THRESHOLD, 6) - PARAM(Solver.ITERATIVE, "SOR") + //PARAM(Solver.ITERATIVE, "SOR") + //PARAM(Solver.ITERATIVE, "MAT") + PARAM(Solver.ITERATIVE, "GMRES") PARAM(Solver.PARALLEL, 1) PARAM(Solver.SOR_FACTOR, 1.00) #else |