diff options
author | 2020-09-07 22:30:00 +0200 | |
---|---|---|
committer | 2020-09-07 22:30:00 +0200 | |
commit | 8ed8d67932af4ba4ffde5bd83d63db5c6839a506 (patch) | |
tree | 31df046574b0465d497e2be737c0909bc3e7e654 | |
parent | 762284f57925b05c6fb00bab7a32663d949f4ee0 (diff) |
netlist: start work on modules.
* Modules are netlists for which automatic lib entries are generated.
* Going forward you just store them in macro/modules and they will be
automatically registered as device elements.
* you need to do a "make generated" is src/lib/netlist/build
* cpp still needs to be added to netlist.lua
-rw-r--r-- | scripts/src/netlist.lua | 3 | ||||
-rw-r--r-- | src/lib/netlist/build/makefile | 7 | ||||
-rw-r--r-- | src/lib/netlist/examples/cmos_inverter.cpp | 10 | ||||
-rwxr-xr-x | src/lib/netlist/generated/nld_devinc.h | 8 | ||||
-rw-r--r-- | src/lib/netlist/macro/modules/nlmod_RTEST.cpp | 12 | ||||
-rw-r--r-- | src/lib/netlist/macro/nlm_base_lib.cpp | 14 | ||||
-rw-r--r-- | src/lib/netlist/macro/nlm_modules_lib.cpp | 10 | ||||
-rw-r--r-- | src/lib/netlist/nl_base.cpp | 5 | ||||
-rw-r--r-- | src/lib/netlist/nl_errstr.h | 1 | ||||
-rw-r--r-- | src/lib/netlist/nl_parser.cpp | 35 | ||||
-rw-r--r-- | src/lib/netlist/nl_parser.h | 2 | ||||
-rw-r--r-- | src/lib/netlist/nl_setup.h | 13 | ||||
-rwxr-xr-x | src/lib/netlist/prg/nlwav.cpp | 4 |
13 files changed, 90 insertions, 34 deletions
diff --git a/scripts/src/netlist.lua b/scripts/src/netlist.lua index edfc87725f3..a301e250a45 100644 --- a/scripts/src/netlist.lua +++ b/scripts/src/netlist.lua @@ -205,10 +205,13 @@ project "netlist" MAME_DIR .. "src/lib/netlist/macro/nlm_base_lib.cpp", MAME_DIR .. "src/lib/netlist/macro/nlm_ttl74xx_lib.cpp", MAME_DIR .. "src/lib/netlist/macro/nlm_cd4xxx_lib.cpp", + MAME_DIR .. "src/lib/netlist/macro/nlm_modules_lib.cpp", MAME_DIR .. "src/lib/netlist/macro/nlm_opamp_lib.cpp", MAME_DIR .. "src/lib/netlist/macro/nlm_otheric_lib.cpp", MAME_DIR .. "src/lib/netlist/macro/nlm_roms_lib.cpp", + MAME_DIR .. "src/lib/netlist/macro/modules/nlmod_RTEST.cpp", + MAME_DIR .. "src/lib/netlist/generated/static_solvers.cpp", MAME_DIR .. "src/lib/netlist/generated/nld_devinc.h", MAME_DIR .. "src/lib/netlist/generated/lib_entries.hxx", diff --git a/src/lib/netlist/build/makefile b/src/lib/netlist/build/makefile index 543097df807..6f50fd86f79 100644 --- a/src/lib/netlist/build/makefile +++ b/src/lib/netlist/build/makefile @@ -116,7 +116,7 @@ DEPENDCC=$(CC) ifndef FAST -FAST=0 +FAST=1 endif ifeq ($(FAST),1) @@ -138,6 +138,7 @@ OBJDIRS = $(OBJ) \ $(OBJ)/plib \ $(OBJ)/devices \ $(OBJ)/macro \ + $(OBJ)/macro/modules \ $(OBJ)/tests \ $(OBJ)/tools \ $(OBJ)/prg \ @@ -147,6 +148,7 @@ DEVSOURCES = $(SRC)/solver/nld_solver.cpp DEVSOURCES += $(wildcard $(SRC)/devices/*.cpp) DEVSOURCES += $(wildcard $(SRC)/analog/*.cpp) DEVSOURCES += $(wildcard $(SRC)/macro/*.cpp) +DEVSOURCES += $(wildcard $(SRC)/macro/modules/*.cpp) TESTSOURCES = $(wildcard $(SRC)/tests/*.cpp) @@ -287,7 +289,8 @@ clang-libc: -Wmissing-variable-declarations -Wno-float-equal -Wconversion \ -Wno-c++98-compat -Wno-c++98-compat-pedantic -Wformat-nonliteral \ -Wno-exit-time-destructors -Winconsistent-missing-destructor-override \ - -Wno-return-std-move-in-c++11 -Wno-unreachable-code" \ + -Wno-return-std-move-in-c++11 -Wno-unreachable-code \ + -Wno-missing-prototypes" \ LDEXTRAFLAGS=-stdlib=libc++ clang-5: diff --git a/src/lib/netlist/examples/cmos_inverter.cpp b/src/lib/netlist/examples/cmos_inverter.cpp index 9261a1e5919..5c72dda8608 100644 --- a/src/lib/netlist/examples/cmos_inverter.cpp +++ b/src/lib/netlist/examples/cmos_inverter.cpp @@ -12,14 +12,22 @@ NETLIST_START(cmos_inverter) /* Standard stuff */ + //EXTERNAL_SOURCE(modules_lib) + + //INCLUDE(modules_lib) + SOLVER(Solver, 48000) PARAM(Solver.ACCURACY, 1e-7) PARAM(Solver.NR_LOOPS, 5000) PARAM(Solver.METHOD, "MAT_CR") ANALOG_INPUT(V5, 5) + RTEST(X) + NET_C(X.1, V5) + NET_C(X.2, GND) + VS(IN, 5) - PARAM(IN.FUNC, "T 5 *") + PARAM(IN.FUNC, "T * 5") MOSFET(P, "PMOS(VTO=-1.0 KP=2e-3 LAMBDA=2E-2)") MOSFET(M, "NMOS(VTO=1.0 KP=2e-3 LAMBDA=2E-2)") diff --git a/src/lib/netlist/generated/nld_devinc.h b/src/lib/netlist/generated/nld_devinc.h index f5b14563db8..2f0545efc92 100755 --- a/src/lib/netlist/generated/nld_devinc.h +++ b/src/lib/netlist/generated/nld_devinc.h @@ -842,6 +842,14 @@ NET_REGISTER_DEVEXT(MM5837_DIP, __VA_ARGS__) // --------------------------------------------------------------------- +// Source: ../macro/nlm_modules_lib.cpp +// --------------------------------------------------------------------- + +// usage : RTEST(name, ) +#define RTEST(...) \ + NET_REGISTER_DEVEXT(RTEST, __VA_ARGS__) + +// --------------------------------------------------------------------- // Source: ../macro/nlm_opamp_lib.cpp // --------------------------------------------------------------------- diff --git a/src/lib/netlist/macro/modules/nlmod_RTEST.cpp b/src/lib/netlist/macro/modules/nlmod_RTEST.cpp new file mode 100644 index 00000000000..c2ad129c6e3 --- /dev/null +++ b/src/lib/netlist/macro/modules/nlmod_RTEST.cpp @@ -0,0 +1,12 @@ +// license:CC0 +// copyright-holders:Couriersud + +#include "devices/net_lib.h" + +NETLIST_START(RTEST) + + RES(R1, RES_K(10)) + ALIAS(1, R1.1) + ALIAS(2, R1.2) + +NETLIST_END() diff --git a/src/lib/netlist/macro/nlm_base_lib.cpp b/src/lib/netlist/macro/nlm_base_lib.cpp index d4caef36850..2e634b29e2c 100644 --- a/src/lib/netlist/macro/nlm_base_lib.cpp +++ b/src/lib/netlist/macro/nlm_base_lib.cpp @@ -3,16 +3,6 @@ #include "devices/net_lib.h" /* ---------------------------------------------------------------------------- - * External declarations - * ---------------------------------------------------------------------------*/ - -NETLIST_EXTERNAL(cd4xxx_lib) -NETLIST_EXTERNAL(opamp_lib) -NETLIST_EXTERNAL(otheric_lib) -NETLIST_EXTERNAL(ttl74xx_lib) -NETLIST_EXTERNAL(roms_lib) - -/* ---------------------------------------------------------------------------- * Diode Models * ---------------------------------------------------------------------------*/ @@ -123,6 +113,8 @@ NETLIST_START(base_lib) EXTERNAL_SOURCE(otheric_lib) EXTERNAL_SOURCE(roms_lib) + EXTERNAL_SOURCE(modules_lib) + INCLUDE(diode_models) INCLUDE(bjt_models) INCLUDE(mosfet_models) @@ -134,5 +126,7 @@ NETLIST_START(base_lib) INCLUDE(otheric_lib) INCLUDE(roms_lib) + INCLUDE(modules_lib) + NETLIST_END() diff --git a/src/lib/netlist/macro/nlm_modules_lib.cpp b/src/lib/netlist/macro/nlm_modules_lib.cpp new file mode 100644 index 00000000000..d6b3f17c5ff --- /dev/null +++ b/src/lib/netlist/macro/nlm_modules_lib.cpp @@ -0,0 +1,10 @@ +// license:CC0 +// copyright-holders:Couriersud + +#include "devices/net_lib.h" + +NETLIST_START(modules_lib) + + EXTERNAL_LIB_ENTRY(RTEST) + +NETLIST_END() diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 418fbef22de..7bf32d95095 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -135,11 +135,14 @@ namespace netlist // This is for core macro libraries m_setup->parser().add_include<plib::psource_str_t>("devices/net_lib.h", content); -#if 1 +#if 0 NETLIST_NAME(base_lib)(m_setup->parser()); + //m_setup->parser().register_source<source_pattern_t>("../macro/modules/nlmod_{1}.cpp"); + //m_setup->parser().register_source<source_pattern_t>("../macro/nlm_{1}.cpp"); #else #if 1 m_setup->parser().register_source<source_pattern_t>("src/lib/netlist/macro/nlm_{1}.cpp"); + m_setup->parser().register_source<source_pattern_t>("src/lib/netlist/macro/modules/nlmod_{1}.cpp"); m_setup->parser().include("base_lib"); #else // FIXME: This is very slow - need optimized parsing scanning diff --git a/src/lib/netlist/nl_errstr.h b/src/lib/netlist/nl_errstr.h index db15fccd6c8..4b44fb7b963 100644 --- a/src/lib/netlist/nl_errstr.h +++ b/src/lib/netlist/nl_errstr.h @@ -52,6 +52,7 @@ namespace netlist //PERRMSGV(MF_PARAM_NOT_FP_1, 1, "Parameter value <{1}> not floating point") PERRMSGV(MF_TT_LINE_WITHOUT_HEAD, 0, "TT_LINE found without TT_HEAD") PERRMSGV(MF_LOCAL_SOURCE_NOT_FOUND_1, 1, "Local source not found: <{1}>") + PERRMSGV(MF_EXTERNAL_SOURCE_IS_LOCAL_1, 1, "External lib entry appears as a local one: <{1}>") PERRMSGV(MF_TRUTHTABLE_NOT_FOUND_1, 1, "Truthtable not found: <{1}>") // nl_setup.cpp diff --git a/src/lib/netlist/nl_parser.cpp b/src/lib/netlist/nl_parser.cpp index f032a50076e..d5823d2e930 100644 --- a/src/lib/netlist/nl_parser.cpp +++ b/src/lib/netlist/nl_parser.cpp @@ -44,6 +44,7 @@ parser_t::parser_t(nlparse_t &setup) m_tok_INCLUDE = m_tokenizer.register_token("INCLUDE"); m_tok_LOCAL_SOURCE = m_tokenizer.register_token("LOCAL_SOURCE"); m_tok_LOCAL_LIB_ENTRY = m_tokenizer.register_token("LOCAL_LIB_ENTRY"); + m_tok_EXTERNAL_LIB_ENTRY = m_tokenizer.register_token("EXTERNAL_LIB_ENTRY"); m_tok_SUBMODEL = m_tokenizer.register_token("SUBMODEL"); m_tok_NETLIST_START = m_tokenizer.register_token("NETLIST_START"); m_tok_NETLIST_END = m_tokenizer.register_token("NETLIST_END"); @@ -141,6 +142,8 @@ bool parser_t::parse(const token_store &tokstor, const pstring &nlname) //m_cur_local->push_back(token_t(m_tok_paren_right)); in_nl = true; } + // FIXME: do we really need this going forward ? there should be no need + // for NETLIST_EXTERNAL in netlist files else if (token.is(m_tok_NETLIST_EXTERNAL)) { if (in_nl) @@ -197,17 +200,10 @@ void parser_t::parse_netlist(const pstring &nlname) net_local_source(); else if (token.is(m_tok_EXTERNAL_SOURCE)) net_external_source(); - //else if (token.is(m_tok_TRUTHTABLE_START)) - // net_truthtable_start(nlname); else if (token.is(m_tok_LOCAL_LIB_ENTRY)) - { - require_token(m_tok_paren_left); - pstring name(get_identifier()); - register_local_as_source(name); - // FIXME: Need to pass in parameter definition FIXME: get line number right - m_setup.register_lib_entry(name, "", plib::source_location("parser: " + nlname, 1)); - require_token(m_tok_paren_right); - } + net_lib_entry(true); + else if (token.is(m_tok_EXTERNAL_LIB_ENTRY)) + net_lib_entry(false); else if (token.is(m_tok_TRUTHTABLE_ENTRY)) { require_token(m_tok_paren_left); @@ -232,6 +228,21 @@ void parser_t::parse_netlist(const pstring &nlname) } } +void parser_t::net_lib_entry(bool is_local) +{ + require_token(m_tok_paren_left); + pstring name(get_identifier()); + + if (is_local) + register_local_as_source(name); + else if (m_local.find(name) != m_local.end()) + error(MF_EXTERNAL_SOURCE_IS_LOCAL_1(name)); + + // FIXME: Need to pass in parameter definition FIXME: get line number right + m_setup.register_lib_entry(name, "", sourceloc()); + require_token(m_tok_paren_right); +} + void parser_t::net_truthtable_start(const pstring &nlname) { bool head_found(false); @@ -282,7 +293,7 @@ void parser_t::net_truthtable_start(const pstring &nlname) require_token(m_tok_paren_left); require_token(m_tok_paren_right); // FIXME: proper location - m_setup.truthtable_create(desc, def_param, plib::source_location(nlname, 1)); + m_setup.truthtable_create(desc, def_param, sourceloc()); return; } } @@ -355,9 +366,7 @@ void parser_t::register_local_as_source(const pstring &name) { auto p = m_local.find(name); if (p != m_local.end()) - { m_setup.register_source<source_token_t>(name, p->second); - } else error(MF_LOCAL_SOURCE_NOT_FOUND_1(name)); } diff --git a/src/lib/netlist/nl_parser.h b/src/lib/netlist/nl_parser.h index d186effc57c..aafe0911a2e 100644 --- a/src/lib/netlist/nl_parser.h +++ b/src/lib/netlist/nl_parser.h @@ -45,6 +45,7 @@ namespace netlist void net_include(); void net_local_source(); void net_external_source(); + void net_lib_entry(bool is_local); void net_register_dev(); void net_truthtable_start(const pstring &nlname); @@ -75,6 +76,7 @@ namespace netlist token_id_t m_tok_EXTERNAL_SOURCE; token_id_t m_tok_LOCAL_SOURCE; token_id_t m_tok_LOCAL_LIB_ENTRY; + token_id_t m_tok_EXTERNAL_LIB_ENTRY; token_id_t m_tok_TRUTHTABLE_START; token_id_t m_tok_TRUTHTABLE_END; token_id_t m_tok_TRUTHTABLE_ENTRY; diff --git a/src/lib/netlist/nl_setup.h b/src/lib/netlist/nl_setup.h index 716288f6153..7f6988f2951 100644 --- a/src/lib/netlist/nl_setup.h +++ b/src/lib/netlist/nl_setup.h @@ -80,17 +80,20 @@ void NETLIST_NAME(name)(netlist::nlparse_t &setup) \ setup.register_source_proc(# name, &NETLIST_NAME(name)); #define EXTERNAL_SOURCE(name) \ + NETLIST_EXTERNAL(name) \ setup.register_source_proc(# name, &NETLIST_NAME(name)); -#define LOCAL_LIB_ENTRY_1(name) \ - LOCAL_SOURCE(name) \ +#define LOCAL_LIB_ENTRY_2(type, name) \ + type ## _SOURCE(name) \ setup.register_lib_entry(# name, "", PSOURCELOC()); -#define LOCAL_LIB_ENTRY_2(name, param_spec) \ - LOCAL_SOURCE(name) \ +#define LOCAL_LIB_ENTRY_3(type, name, param_spec) \ + type ## _SOURCE(name) \ setup.register_lib_entry(# name, param_spec, PSOURCELOC()); -#define LOCAL_LIB_ENTRY(...) PCALLVARARG(LOCAL_LIB_ENTRY_, __VA_ARGS__) +#define LOCAL_LIB_ENTRY(...) PCALLVARARG(LOCAL_LIB_ENTRY_, LOCAL, __VA_ARGS__) + +#define EXTERNAL_LIB_ENTRY(...) PCALLVARARG(LOCAL_LIB_ENTRY_, EXTERNAL, __VA_ARGS__) #define INCLUDE(name) \ setup.include(# name); diff --git a/src/lib/netlist/prg/nlwav.cpp b/src/lib/netlist/prg/nlwav.cpp index 82e543d9228..4b726bbe2cc 100755 --- a/src/lib/netlist/prg/nlwav.cpp +++ b/src/lib/netlist/prg/nlwav.cpp @@ -82,8 +82,8 @@ public: template <typename T> void write_sample_int(double sample) { - const auto mmax(static_cast<double>(plib::numeric_limits<T>::max())); - const auto mmin(static_cast<double>(plib::numeric_limits<T>::min())); + constexpr auto mmax(static_cast<double>(plib::numeric_limits<T>::max())); + constexpr auto mmin(static_cast<double>(plib::numeric_limits<T>::min())); sample *= mmax; sample = std::max(mmin, sample); |