summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author couriersud <couriersud@gmx.org>2020-09-07 22:30:00 +0200
committer couriersud <couriersud@gmx.org>2020-09-07 22:30:00 +0200
commit8ed8d67932af4ba4ffde5bd83d63db5c6839a506 (patch)
tree31df046574b0465d497e2be737c0909bc3e7e654
parent762284f57925b05c6fb00bab7a32663d949f4ee0 (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.lua3
-rw-r--r--src/lib/netlist/build/makefile7
-rw-r--r--src/lib/netlist/examples/cmos_inverter.cpp10
-rwxr-xr-xsrc/lib/netlist/generated/nld_devinc.h8
-rw-r--r--src/lib/netlist/macro/modules/nlmod_RTEST.cpp12
-rw-r--r--src/lib/netlist/macro/nlm_base_lib.cpp14
-rw-r--r--src/lib/netlist/macro/nlm_modules_lib.cpp10
-rw-r--r--src/lib/netlist/nl_base.cpp5
-rw-r--r--src/lib/netlist/nl_errstr.h1
-rw-r--r--src/lib/netlist/nl_parser.cpp35
-rw-r--r--src/lib/netlist/nl_parser.h2
-rw-r--r--src/lib/netlist/nl_setup.h13
-rwxr-xr-xsrc/lib/netlist/prg/nlwav.cpp4
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);