mirror of
https://github.com/holub/mame
synced 2025-07-01 16:19:38 +03:00
netlist: bug fixes and nltool validation.
nltool now supports a validate command which acts similar to MAME's validation.
This commit is contained in:
parent
6b96f7ba60
commit
7adbce9b66
@ -280,7 +280,8 @@ namespace analog
|
|||||||
}
|
}
|
||||||
|
|
||||||
m_vto = m_model.m_VTO;
|
m_vto = m_model.m_VTO;
|
||||||
nl_assert_always(m_vto != 0.0, "Threshold voltage not specified for " + m_model.name());
|
if(m_vto != 0.0)
|
||||||
|
log().info("Threshold voltage not specified for {1}", m_model.name());
|
||||||
|
|
||||||
/* FIXME: VTO if missing may be calculated from TPG, NSS and temperature. Usually models
|
/* FIXME: VTO if missing may be calculated from TPG, NSS and temperature. Usually models
|
||||||
* specify VTO so skip this here.
|
* specify VTO so skip this here.
|
||||||
|
@ -46,7 +46,7 @@ namespace netlist
|
|||||||
register_subalias("5", m_O[4]);
|
register_subalias("5", m_O[4]);
|
||||||
register_subalias("6", m_O[5]);
|
register_subalias("6", m_O[5]);
|
||||||
register_subalias("7", m_O[6]);
|
register_subalias("7", m_O[6]);
|
||||||
register_subalias("8", "GND");
|
register_subalias("8", "GND");
|
||||||
|
|
||||||
register_subalias("9", m_O[7]);
|
register_subalias("9", m_O[7]);
|
||||||
register_subalias("10", m_A[0]);
|
register_subalias("10", m_A[0]);
|
||||||
|
@ -105,7 +105,7 @@ namespace netlist
|
|||||||
register_subalias("13", m_D.m_OUT);
|
register_subalias("13", m_D.m_OUT);
|
||||||
register_subalias("14", m_D.m_RC);
|
register_subalias("14", m_D.m_RC);
|
||||||
register_subalias("15", m_D.m_IN);
|
register_subalias("15", m_D.m_IN);
|
||||||
register_subalias("8", "VSS");
|
register_subalias("16", "VSS");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
#define TTL_7400_NAND(name, cA, cB) \
|
#define TTL_7400_NAND(name, cA, cB) \
|
||||||
NET_REGISTER_DEV(TTL_7400_NAND, name) \
|
NET_REGISTER_DEV(TTL_7400_NAND, name) \
|
||||||
NET_CONNECT(name, VCC, VCC) \
|
NET_CONNECT(name, VCC, VCC) \
|
||||||
NET_CONNECT(name, GND, GND) \
|
NET_CONNECT(name, GND, GND) \
|
||||||
NET_CONNECT(name, A, cA) \
|
NET_CONNECT(name, A, cA) \
|
||||||
NET_CONNECT(name, B, cB)
|
NET_CONNECT(name, B, cB)
|
||||||
@ -32,7 +32,7 @@
|
|||||||
|
|
||||||
#define TTL_7402_NOR(name, cI1, cI2) \
|
#define TTL_7402_NOR(name, cI1, cI2) \
|
||||||
NET_REGISTER_DEV(TTL_7402_NOR, name) \
|
NET_REGISTER_DEV(TTL_7402_NOR, name) \
|
||||||
NET_CONNECT(name, VCC, VCC) \
|
NET_CONNECT(name, VCC, VCC) \
|
||||||
NET_CONNECT(name, GND, GND) \
|
NET_CONNECT(name, GND, GND) \
|
||||||
NET_CONNECT(name, A, cI1) \
|
NET_CONNECT(name, A, cI1) \
|
||||||
NET_CONNECT(name, B, cI2)
|
NET_CONNECT(name, B, cI2)
|
||||||
@ -45,7 +45,7 @@
|
|||||||
|
|
||||||
#define TTL_7404_INVERT(name, cA) \
|
#define TTL_7404_INVERT(name, cA) \
|
||||||
NET_REGISTER_DEV(TTL_7404_INVERT, name) \
|
NET_REGISTER_DEV(TTL_7404_INVERT, name) \
|
||||||
NET_CONNECT(name, VCC, VCC) \
|
NET_CONNECT(name, VCC, VCC) \
|
||||||
NET_CONNECT(name, GND, GND) \
|
NET_CONNECT(name, GND, GND) \
|
||||||
NET_CONNECT(name, A, cA)
|
NET_CONNECT(name, A, cA)
|
||||||
|
|
||||||
@ -57,7 +57,7 @@
|
|||||||
|
|
||||||
#define TTL_7408_AND(name, cA, cB) \
|
#define TTL_7408_AND(name, cA, cB) \
|
||||||
NET_REGISTER_DEV(TTL_7408_AND, name) \
|
NET_REGISTER_DEV(TTL_7408_AND, name) \
|
||||||
NET_CONNECT(name, VCC, VCC) \
|
NET_CONNECT(name, VCC, VCC) \
|
||||||
NET_CONNECT(name, GND, GND) \
|
NET_CONNECT(name, GND, GND) \
|
||||||
NET_CONNECT(name, A, cA) \
|
NET_CONNECT(name, A, cA) \
|
||||||
NET_CONNECT(name, B, cB)
|
NET_CONNECT(name, B, cB)
|
||||||
@ -70,7 +70,7 @@
|
|||||||
|
|
||||||
#define TTL_7410_NAND(name, cI1, cI2, cI3) \
|
#define TTL_7410_NAND(name, cI1, cI2, cI3) \
|
||||||
NET_REGISTER_DEV(TTL_7410_NAND, name) \
|
NET_REGISTER_DEV(TTL_7410_NAND, name) \
|
||||||
NET_CONNECT(name, VCC, VCC) \
|
NET_CONNECT(name, VCC, VCC) \
|
||||||
NET_CONNECT(name, GND, GND) \
|
NET_CONNECT(name, GND, GND) \
|
||||||
NET_CONNECT(name, A, cI1) \
|
NET_CONNECT(name, A, cI1) \
|
||||||
NET_CONNECT(name, B, cI2) \
|
NET_CONNECT(name, B, cI2) \
|
||||||
@ -85,7 +85,7 @@
|
|||||||
|
|
||||||
#define TTL_7411_AND(name, cI1, cI2, cI3) \
|
#define TTL_7411_AND(name, cI1, cI2, cI3) \
|
||||||
NET_REGISTER_DEV(TTL_7411_AND, name) \
|
NET_REGISTER_DEV(TTL_7411_AND, name) \
|
||||||
NET_CONNECT(name, VCC, VCC) \
|
NET_CONNECT(name, VCC, VCC) \
|
||||||
NET_CONNECT(name, GND, GND) \
|
NET_CONNECT(name, GND, GND) \
|
||||||
NET_CONNECT(name, A, cI1) \
|
NET_CONNECT(name, A, cI1) \
|
||||||
NET_CONNECT(name, B, cI2) \
|
NET_CONNECT(name, B, cI2) \
|
||||||
@ -120,7 +120,7 @@
|
|||||||
|
|
||||||
#define TTL_7420_NAND(name, cI1, cI2, cI3, cI4) \
|
#define TTL_7420_NAND(name, cI1, cI2, cI3, cI4) \
|
||||||
NET_REGISTER_DEV(TTL_7420_NAND, name) \
|
NET_REGISTER_DEV(TTL_7420_NAND, name) \
|
||||||
NET_CONNECT(name, VCC, VCC) \
|
NET_CONNECT(name, VCC, VCC) \
|
||||||
NET_CONNECT(name, GND, GND) \
|
NET_CONNECT(name, GND, GND) \
|
||||||
NET_CONNECT(name, A, cI1) \
|
NET_CONNECT(name, A, cI1) \
|
||||||
NET_CONNECT(name, B, cI2) \
|
NET_CONNECT(name, B, cI2) \
|
||||||
@ -136,7 +136,7 @@
|
|||||||
|
|
||||||
#define TTL_7425_NOR(name, cI1, cI2, cI3, cI4) \
|
#define TTL_7425_NOR(name, cI1, cI2, cI3, cI4) \
|
||||||
NET_REGISTER_DEV(TTL_7425_NOR, name) \
|
NET_REGISTER_DEV(TTL_7425_NOR, name) \
|
||||||
NET_CONNECT(name, VCC, VCC) \
|
NET_CONNECT(name, VCC, VCC) \
|
||||||
NET_CONNECT(name, GND, GND) \
|
NET_CONNECT(name, GND, GND) \
|
||||||
NET_CONNECT(name, A, cI1) \
|
NET_CONNECT(name, A, cI1) \
|
||||||
NET_CONNECT(name, B, cI2) \
|
NET_CONNECT(name, B, cI2) \
|
||||||
@ -152,7 +152,7 @@
|
|||||||
|
|
||||||
#define TTL_7427_NOR(name, cI1, cI2, cI3) \
|
#define TTL_7427_NOR(name, cI1, cI2, cI3) \
|
||||||
NET_REGISTER_DEV(TTL_7427_NOR, name) \
|
NET_REGISTER_DEV(TTL_7427_NOR, name) \
|
||||||
NET_CONNECT(name, VCC, VCC) \
|
NET_CONNECT(name, VCC, VCC) \
|
||||||
NET_CONNECT(name, GND, GND) \
|
NET_CONNECT(name, GND, GND) \
|
||||||
NET_CONNECT(name, A, cI1) \
|
NET_CONNECT(name, A, cI1) \
|
||||||
NET_CONNECT(name, B, cI2) \
|
NET_CONNECT(name, B, cI2) \
|
||||||
@ -167,7 +167,7 @@
|
|||||||
|
|
||||||
#define TTL_7430_NAND(name, cI1, cI2, cI3, cI4, cI5, cI6, cI7, cI8)\
|
#define TTL_7430_NAND(name, cI1, cI2, cI3, cI4, cI5, cI6, cI7, cI8)\
|
||||||
NET_REGISTER_DEV(TTL_7430_NAND, name) \
|
NET_REGISTER_DEV(TTL_7430_NAND, name) \
|
||||||
NET_CONNECT(name, VCC, VCC) \
|
NET_CONNECT(name, VCC, VCC) \
|
||||||
NET_CONNECT(name, GND, GND) \
|
NET_CONNECT(name, GND, GND) \
|
||||||
NET_CONNECT(name, A, cI1) \
|
NET_CONNECT(name, A, cI1) \
|
||||||
NET_CONNECT(name, B, cI2) \
|
NET_CONNECT(name, B, cI2) \
|
||||||
@ -187,7 +187,7 @@
|
|||||||
|
|
||||||
#define TTL_7432_OR(name, cI1, cI2) \
|
#define TTL_7432_OR(name, cI1, cI2) \
|
||||||
NET_REGISTER_DEV(TTL_7432_OR, name) \
|
NET_REGISTER_DEV(TTL_7432_OR, name) \
|
||||||
NET_CONNECT(name, VCC, VCC) \
|
NET_CONNECT(name, VCC, VCC) \
|
||||||
NET_CONNECT(name, GND, GND) \
|
NET_CONNECT(name, GND, GND) \
|
||||||
NET_CONNECT(name, A, cI1) \
|
NET_CONNECT(name, A, cI1) \
|
||||||
NET_CONNECT(name, B, cI2)
|
NET_CONNECT(name, B, cI2)
|
||||||
@ -200,7 +200,7 @@
|
|||||||
|
|
||||||
#define TTL_7437_NAND(name, cA, cB) \
|
#define TTL_7437_NAND(name, cA, cB) \
|
||||||
NET_REGISTER_DEV(TTL_7437_NAND, name) \
|
NET_REGISTER_DEV(TTL_7437_NAND, name) \
|
||||||
NET_CONNECT(name, VCC, VCC) \
|
NET_CONNECT(name, VCC, VCC) \
|
||||||
NET_CONNECT(name, GND, GND) \
|
NET_CONNECT(name, GND, GND) \
|
||||||
NET_CONNECT(name, A, cA) \
|
NET_CONNECT(name, A, cA) \
|
||||||
NET_CONNECT(name, B, cB)
|
NET_CONNECT(name, B, cB)
|
||||||
@ -214,7 +214,7 @@
|
|||||||
|
|
||||||
#define TTL_7486_XOR(name, cA, cB) \
|
#define TTL_7486_XOR(name, cA, cB) \
|
||||||
NET_REGISTER_DEV(TTL_7486_XOR, name) \
|
NET_REGISTER_DEV(TTL_7486_XOR, name) \
|
||||||
NET_CONNECT(name, VCC, VCC) \
|
NET_CONNECT(name, VCC, VCC) \
|
||||||
NET_CONNECT(name, GND, GND) \
|
NET_CONNECT(name, GND, GND) \
|
||||||
NET_CONNECT(name, A, cA) \
|
NET_CONNECT(name, A, cA) \
|
||||||
NET_CONNECT(name, B, cB)
|
NET_CONNECT(name, B, cB)
|
||||||
@ -233,7 +233,7 @@
|
|||||||
|
|
||||||
#define TTL_74260_NOR(name, cA, cB, cC, cD, cE) \
|
#define TTL_74260_NOR(name, cA, cB, cC, cD, cE) \
|
||||||
NET_REGISTER_DEV(TTL_74260_NOR, name) \
|
NET_REGISTER_DEV(TTL_74260_NOR, name) \
|
||||||
NET_CONNECT(name, VCC, VCC) \
|
NET_CONNECT(name, VCC, VCC) \
|
||||||
NET_CONNECT(name, GND, GND) \
|
NET_CONNECT(name, GND, GND) \
|
||||||
NET_CONNECT(name, A, cA) \
|
NET_CONNECT(name, A, cA) \
|
||||||
NET_CONNECT(name, B, cB) \
|
NET_CONNECT(name, B, cB) \
|
||||||
@ -249,7 +249,7 @@
|
|||||||
|
|
||||||
#define DM9312(name, cA, cB, cC, cSTROBE, cD0, cD1, cD2, cD3, cD4, cD5, cD6, cD7) \
|
#define DM9312(name, cA, cB, cC, cSTROBE, cD0, cD1, cD2, cD3, cD4, cD5, cD6, cD7) \
|
||||||
NET_REGISTER_DEV(DM9312_TT, name) \
|
NET_REGISTER_DEV(DM9312_TT, name) \
|
||||||
NET_CONNECT(name, VCC, VCC) \
|
NET_CONNECT(name, VCC, VCC) \
|
||||||
NET_CONNECT(name, GND, GND) \
|
NET_CONNECT(name, GND, GND) \
|
||||||
NET_CONNECT(name, A, cA) \
|
NET_CONNECT(name, A, cA) \
|
||||||
NET_CONNECT(name, B, cB) \
|
NET_CONNECT(name, B, cB) \
|
||||||
|
@ -110,8 +110,8 @@ PERRMSGV(MI_LOGIC_OUTPUT_1_WITHOUT_CONNECTIONS, 1, "Found logic output {1} witho
|
|||||||
PERRMSGV(MW_LOGIC_INPUT_1_WITHOUT_CONNECTIONS, 1, "Found logic input {1} without connections")
|
PERRMSGV(MW_LOGIC_INPUT_1_WITHOUT_CONNECTIONS, 1, "Found logic input {1} without connections")
|
||||||
PERRMSGV(MW_TERMINAL_1_WITHOUT_CONNECTIONS, 1, "Found terminal {1} without connections")
|
PERRMSGV(MW_TERMINAL_1_WITHOUT_CONNECTIONS, 1, "Found terminal {1} without connections")
|
||||||
|
|
||||||
PERRMSGV(ME_TERMINAL_1_WITHOUT_NET, 1, "Found terminal {1} without a net")
|
PERRMSGV(ME_TERMINAL_1_WITHOUT_NET, 1, "Found terminal {1} without a net")
|
||||||
PERRMSGV(MF_TERMINALS_WITHOUT_NET, 0, "Found terminals without a net")
|
PERRMSGV(MF_TERMINALS_WITHOUT_NET, 0, "Found terminals without a net")
|
||||||
|
|
||||||
PERRMSGV(MI_REMOVE_DEVICE_1_CONNECTED_ONLY_TO_RAILS_2_3, 3, "Found device {1} connected only to railterminals {2}/{3}. Will be removed")
|
PERRMSGV(MI_REMOVE_DEVICE_1_CONNECTED_ONLY_TO_RAILS_2_3, 3, "Found device {1} connected only to railterminals {2}/{3}. Will be removed")
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
#define NLTOOL_VERSION 20190202
|
#define NLTOOL_VERSION 20190420
|
||||||
|
|
||||||
class tool_app_t : public plib::app
|
class tool_app_t : public plib::app
|
||||||
{
|
{
|
||||||
@ -25,7 +25,7 @@ public:
|
|||||||
tool_app_t() :
|
tool_app_t() :
|
||||||
plib::app(),
|
plib::app(),
|
||||||
opt_grp1(*this, "General options", "The following options apply to all commands."),
|
opt_grp1(*this, "General options", "The following options apply to all commands."),
|
||||||
opt_cmd (*this, "c", "cmd", 0, std::vector<pstring>({"run","convert","listdevices","static","header","docheader"}), "run|convert|listdevices|static|header|docheader"),
|
opt_cmd (*this, "c", "cmd", 0, std::vector<pstring>({"run","validate","convert","listdevices","static","header","docheader"}), "run|validate|convert|listdevices|static|header|docheader"),
|
||||||
opt_file(*this, "f", "file", "-", "file to process (default is stdin)"),
|
opt_file(*this, "f", "file", "-", "file to process (default is stdin)"),
|
||||||
opt_defines(*this, "D", "define", "predefine value as macro, e.g. -Dname=value. If '=value' is omitted predefine it as 1. This option may be specified repeatedly."),
|
opt_defines(*this, "D", "define", "predefine value as macro, e.g. -Dname=value. If '=value' is omitted predefine it as 1. This option may be specified repeatedly."),
|
||||||
opt_rfolders(*this, "r", "rom", "where to look for data files"),
|
opt_rfolders(*this, "r", "rom", "where to look for data files"),
|
||||||
@ -56,7 +56,10 @@ public:
|
|||||||
opt_ex2(*this, "nltool --cmd=listdevices",
|
opt_ex2(*this, "nltool --cmd=listdevices",
|
||||||
"List all known devices."),
|
"List all known devices."),
|
||||||
opt_ex3(*this, "nltool --cmd=header --tab-width=8 --line-width=80",
|
opt_ex3(*this, "nltool --cmd=header --tab-width=8 --line-width=80",
|
||||||
"Create the header file needed for including netlists as code.")
|
"Create the header file needed for including netlists as code."),
|
||||||
|
|
||||||
|
m_warnings(0),
|
||||||
|
m_errors(0)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
plib::option_group opt_grp1;
|
plib::option_group opt_grp1;
|
||||||
@ -88,12 +91,16 @@ public:
|
|||||||
int execute() override;
|
int execute() override;
|
||||||
pstring usage() override;
|
pstring usage() override;
|
||||||
|
|
||||||
|
int m_warnings;
|
||||||
|
int m_errors;
|
||||||
private:
|
private:
|
||||||
void run();
|
void run();
|
||||||
|
void validate();
|
||||||
|
void convert();
|
||||||
void static_compile();
|
void static_compile();
|
||||||
|
|
||||||
void mac_out(const pstring &s, const bool cont = true);
|
void mac_out(const pstring &s, const bool cont = true);
|
||||||
void cmac(const netlist::factory::element_t *e);
|
void header_entry(const netlist::factory::element_t *e);
|
||||||
void mac(const netlist::factory::element_t *e);
|
void mac(const netlist::factory::element_t *e);
|
||||||
|
|
||||||
void create_header();
|
void create_header();
|
||||||
@ -126,28 +133,26 @@ public:
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
plib::unique_ptr<plib::pistream> stream(const pstring &file) override;
|
plib::unique_ptr<plib::pistream> stream(const pstring &file) override
|
||||||
|
{
|
||||||
|
pstring name = m_folder + "/" + file;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
auto strm = plib::make_unique<plib::pifilestream>(name);
|
||||||
|
return std::move(strm);
|
||||||
|
}
|
||||||
|
catch (const plib::pexception &e)
|
||||||
|
{
|
||||||
|
if (dynamic_cast<const plib::file_open_e *>(&e) == nullptr )
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
return plib::unique_ptr<plib::pistream>(nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
pstring m_folder;
|
pstring m_folder;
|
||||||
};
|
};
|
||||||
|
|
||||||
plib::unique_ptr<plib::pistream> netlist_data_folder_t::stream(const pstring &file)
|
|
||||||
{
|
|
||||||
pstring name = m_folder + "/" + file;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
auto strm = plib::make_unique<plib::pifilestream>(name);
|
|
||||||
return std::move(strm);
|
|
||||||
}
|
|
||||||
catch (const plib::pexception &e)
|
|
||||||
{
|
|
||||||
if (dynamic_cast<const plib::file_open_e *>(&e) == nullptr )
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
return plib::unique_ptr<plib::pistream>(nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
class netlist_tool_callbacks_t : public netlist::callbacks_t
|
class netlist_tool_callbacks_t : public netlist::callbacks_t
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -196,8 +201,6 @@ public:
|
|||||||
|
|
||||||
// start devices
|
// start devices
|
||||||
setup().prepare_to_run();
|
setup().prepare_to_run();
|
||||||
// reset
|
|
||||||
this->reset();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void create_dynamic_logs(const std::vector<pstring> &logs)
|
void create_dynamic_logs(const std::vector<pstring> &logs)
|
||||||
@ -266,10 +269,17 @@ private:
|
|||||||
void netlist_tool_callbacks_t::vlog(const plib::plog_level &l, const pstring &ls) const
|
void netlist_tool_callbacks_t::vlog(const plib::plog_level &l, const pstring &ls) const
|
||||||
{
|
{
|
||||||
pstring err = plib::pfmt("{}: {}\n")(l.name())(ls.c_str());
|
pstring err = plib::pfmt("{}: {}\n")(l.name())(ls.c_str());
|
||||||
// FIXME: ...
|
if (l == plib::plog_level::WARNING)
|
||||||
m_app.pout("{}", err);
|
m_app.m_warnings++;
|
||||||
|
if (l == plib::plog_level::ERROR)
|
||||||
|
m_app.m_errors++;
|
||||||
if (l == plib::plog_level::FATAL)
|
if (l == plib::plog_level::FATAL)
|
||||||
|
{
|
||||||
|
m_app.m_errors++;
|
||||||
throw netlist::nl_exception(err);
|
throw netlist::nl_exception(err);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
m_app.pout("{}", err);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct input_t
|
struct input_t
|
||||||
@ -346,12 +356,14 @@ void tool_app_t::run()
|
|||||||
if (!opt_verb())
|
if (!opt_verb())
|
||||||
nt.log().verbose.set_enabled(false);
|
nt.log().verbose.set_enabled(false);
|
||||||
if (opt_quiet())
|
if (opt_quiet())
|
||||||
nt.log().warning.set_enabled(false);
|
nt.log().info.set_enabled(false);
|
||||||
|
|
||||||
nt.read_netlist(opt_file(), opt_name(),
|
nt.read_netlist(opt_file(), opt_name(),
|
||||||
opt_logs(),
|
opt_logs(),
|
||||||
m_options, opt_rfolders());
|
m_options, opt_rfolders());
|
||||||
|
|
||||||
|
nt.reset();
|
||||||
|
|
||||||
inps = read_input(nt.setup(), opt_inp());
|
inps = read_input(nt.setup(), opt_inp());
|
||||||
ttr = netlist::netlist_time::from_double(opt_ttr());
|
ttr = netlist::netlist_time::from_double(opt_ttr());
|
||||||
}
|
}
|
||||||
@ -416,6 +428,47 @@ void tool_app_t::run()
|
|||||||
(ttr - nlt).as_double() / emutime * 100.0);
|
(ttr - nlt).as_double() / emutime * 100.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tool_app_t::validate()
|
||||||
|
{
|
||||||
|
std::vector<input_t> inps;
|
||||||
|
netlist::netlist_time ttr;
|
||||||
|
netlist_tool_t nt(*this, "netlist");
|
||||||
|
|
||||||
|
if (!opt_verb())
|
||||||
|
nt.log().verbose.set_enabled(false);
|
||||||
|
if (opt_quiet())
|
||||||
|
nt.log().info.set_enabled(false);
|
||||||
|
|
||||||
|
m_errors = 0;
|
||||||
|
m_warnings = 0;
|
||||||
|
|
||||||
|
nt.setup().enable_validation();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
nt.init();
|
||||||
|
|
||||||
|
nt.read_netlist(opt_file(), opt_name(),
|
||||||
|
opt_logs(),
|
||||||
|
m_options, opt_rfolders());
|
||||||
|
}
|
||||||
|
catch (netlist::nl_exception &e)
|
||||||
|
{
|
||||||
|
pout("Netlist exception caught: {}\n", e.text());
|
||||||
|
}
|
||||||
|
catch (plib::pexception &e)
|
||||||
|
{
|
||||||
|
pout("plib exception caught: {}\n", e.text());
|
||||||
|
}
|
||||||
|
|
||||||
|
//pout("Validation warnings: {}\n", m_warnings);
|
||||||
|
//pout("Validation errors: {}\n", m_errors);
|
||||||
|
|
||||||
|
if (m_warnings + m_errors > 0)
|
||||||
|
throw netlist::nl_exception("validation: {1} errors {2} warnings", m_errors, m_warnings);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void tool_app_t::static_compile()
|
void tool_app_t::static_compile()
|
||||||
{
|
{
|
||||||
netlist_tool_t nt(*this, "netlist");
|
netlist_tool_t nt(*this, "netlist");
|
||||||
@ -423,12 +476,14 @@ void tool_app_t::static_compile()
|
|||||||
nt.init();
|
nt.init();
|
||||||
|
|
||||||
nt.log().verbose.set_enabled(false);
|
nt.log().verbose.set_enabled(false);
|
||||||
nt.log().warning.set_enabled(false);
|
nt.log().info.set_enabled(false);
|
||||||
|
|
||||||
nt.read_netlist(opt_file(), opt_name(),
|
nt.read_netlist(opt_file(), opt_name(),
|
||||||
opt_logs(),
|
opt_logs(),
|
||||||
m_options, opt_rfolders());
|
m_options, opt_rfolders());
|
||||||
|
|
||||||
|
// no reset needed ...
|
||||||
|
|
||||||
plib::putf8_writer w(&pout_strm);
|
plib::putf8_writer w(&pout_strm);
|
||||||
std::map<pstring, pstring> mp;
|
std::map<pstring, pstring> mp;
|
||||||
|
|
||||||
@ -470,20 +525,23 @@ void tool_app_t::mac_out(const pstring &s, const bool cont)
|
|||||||
pout("{1}\n", s);
|
pout("{1}\n", s);
|
||||||
}
|
}
|
||||||
|
|
||||||
void tool_app_t::cmac(const netlist::factory::element_t *e)
|
void tool_app_t::header_entry(const netlist::factory::element_t *e)
|
||||||
{
|
{
|
||||||
auto v = plib::psplit(e->param_desc(), ",");
|
auto v = plib::psplit(e->param_desc(), ",");
|
||||||
pstring vs;
|
pstring vs;
|
||||||
for (const auto &s : v)
|
for (const auto &s : v)
|
||||||
vs += ", p" + plib::replace_all(plib::replace_all(s, "+", ""), ".", "_");
|
if (!plib::startsWith(s, "@"))
|
||||||
|
vs += ", p" + plib::replace_all(plib::replace_all(s, "+", ""), ".", "_");
|
||||||
mac_out("#define " + e->name() + "(name" + vs + ")");
|
mac_out("#define " + e->name() + "(name" + vs + ")");
|
||||||
mac_out("\tNET_REGISTER_DEV(" + e->name() +", name)");
|
mac_out("\tNET_REGISTER_DEV(" + e->name() +", name)");
|
||||||
|
|
||||||
for (const auto &s : v)
|
for (const auto &s : v)
|
||||||
{
|
{
|
||||||
pstring r(plib::replace_all(plib::replace_all(s, "+", ""), ".", "_"));
|
pstring r(plib::replace_all(plib::replace_all(plib::replace_all(s, "+", ""), ".", "_"), "@",""));
|
||||||
if (plib::startsWith(s, "+"))
|
if (plib::startsWith(s, "+"))
|
||||||
mac_out("\tNET_CONNECT(name, " + r + ", p" + r + ")");
|
mac_out("\tNET_CONNECT(name, " + r + ", p" + r + ")");
|
||||||
|
else if (plib::startsWith(s, "@"))
|
||||||
|
mac_out("\tNET_CONNECT(name, " + r + ", " + r + ")");
|
||||||
else
|
else
|
||||||
mac_out("\tNETDEV_PARAMI(name, " + r + ", p" + r + ")");
|
mac_out("\tNETDEV_PARAMI(name, " + r + ", p" + r + ")");
|
||||||
}
|
}
|
||||||
@ -495,18 +553,20 @@ void tool_app_t::mac(const netlist::factory::element_t *e)
|
|||||||
auto v = plib::psplit(e->param_desc(), ",");
|
auto v = plib::psplit(e->param_desc(), ",");
|
||||||
pstring vs;
|
pstring vs;
|
||||||
for (const auto &s : v)
|
for (const auto &s : v)
|
||||||
{
|
if (!plib::startsWith(s, "@"))
|
||||||
vs += ", " + plib::replace_all(plib::replace_all(s, "+", ""), ".", "_");
|
vs += ", " + plib::replace_all(plib::replace_all(s, "+", ""), ".", "_");
|
||||||
}
|
|
||||||
pout("{1}(name{2})\n", e->name(), vs);
|
pout("{1}(name{2})\n", e->name(), vs);
|
||||||
if (v.size() > 0)
|
if (v.size() > 0)
|
||||||
{
|
{
|
||||||
pout("/*\n");
|
pout("/*\n");
|
||||||
for (const auto &s : v)
|
for (const auto &s : v)
|
||||||
{
|
{
|
||||||
pstring r(plib::replace_all(plib::replace_all(s, "+", ""), ".", "_"));
|
pstring r(plib::replace_all(plib::replace_all(plib::replace_all(s, "+", ""), ".", "_"), "@",""));
|
||||||
if (plib::startsWith(s, "+"))
|
if (plib::startsWith(s, "+"))
|
||||||
pout("{1:10}: Terminal\n",r);
|
pout("{1:10}: Terminal\n",r);
|
||||||
|
else if (plib::startsWith(s, "@"))
|
||||||
|
pout("{1:10}: Power terminal - automatically connected\n", r);
|
||||||
else
|
else
|
||||||
pout("{1:10}: Parameter\n", r);
|
pout("{1:10}: Parameter\n", r);
|
||||||
}
|
}
|
||||||
@ -521,7 +581,7 @@ void tool_app_t::create_header()
|
|||||||
nt.init();
|
nt.init();
|
||||||
|
|
||||||
nt.log().verbose.set_enabled(false);
|
nt.log().verbose.set_enabled(false);
|
||||||
nt.log().warning.set_enabled(false);
|
nt.log().info.set_enabled(false);
|
||||||
|
|
||||||
nt.setup().register_source(plib::make_unique<netlist::source_proc_t>("dummy", &netlist_dummy));
|
nt.setup().register_source(plib::make_unique<netlist::source_proc_t>("dummy", &netlist_dummy));
|
||||||
nt.setup().include("dummy");
|
nt.setup().include("dummy");
|
||||||
@ -550,7 +610,7 @@ void tool_app_t::create_header()
|
|||||||
pout("{1}{2}\n", pstring("// Source: "), plib::replace_all(e->sourcefile(), "../", ""));
|
pout("{1}{2}\n", pstring("// Source: "), plib::replace_all(e->sourcefile(), "../", ""));
|
||||||
pout("{1}\n", plib::rpad(pstring("// "), pstring("-"), opt_linewidth()));
|
pout("{1}\n", plib::rpad(pstring("// "), pstring("-"), opt_linewidth()));
|
||||||
}
|
}
|
||||||
cmac(e.get());
|
header_entry(e.get());
|
||||||
}
|
}
|
||||||
pout("#endif // __PLIB_PREPROCESSOR__\n");
|
pout("#endif // __PLIB_PREPROCESSOR__\n");
|
||||||
pout("#endif\n");
|
pout("#endif\n");
|
||||||
@ -565,7 +625,7 @@ void tool_app_t::create_docheader()
|
|||||||
nt.init();
|
nt.init();
|
||||||
|
|
||||||
nt.log().verbose.set_enabled(false);
|
nt.log().verbose.set_enabled(false);
|
||||||
nt.log().warning.set_enabled(false);
|
nt.log().info.set_enabled(false);
|
||||||
|
|
||||||
nt.setup().register_source(plib::make_unique<netlist::source_proc_t>("dummy", &netlist_dummy));
|
nt.setup().register_source(plib::make_unique<netlist::source_proc_t>("dummy", &netlist_dummy));
|
||||||
nt.setup().include("dummy");
|
nt.setup().include("dummy");
|
||||||
@ -594,7 +654,7 @@ void tool_app_t::create_docheader()
|
|||||||
for (auto &e : nt.setup().factory())
|
for (auto &e : nt.setup().factory())
|
||||||
{
|
{
|
||||||
pout("//! [{1} csynopsis]\n", e->name());
|
pout("//! [{1} csynopsis]\n", e->name());
|
||||||
cmac(e.get());
|
header_entry(e.get());
|
||||||
pout("//! [{1} csynopsis]\n", e->name());
|
pout("//! [{1} csynopsis]\n", e->name());
|
||||||
pout("//! [{1} synopsis]\n", e->name());
|
pout("//! [{1} synopsis]\n", e->name());
|
||||||
mac(e.get());
|
mac(e.get());
|
||||||
@ -612,10 +672,10 @@ void tool_app_t::listdevices()
|
|||||||
{
|
{
|
||||||
netlist_tool_t nt(*this, "netlist");
|
netlist_tool_t nt(*this, "netlist");
|
||||||
nt.init();
|
nt.init();
|
||||||
if (!opt_verb())
|
|
||||||
nt.log().verbose.set_enabled(false);
|
nt.log().verbose.set_enabled(false);
|
||||||
if (opt_quiet())
|
nt.log().info.set_enabled(false);
|
||||||
nt.log().warning.set_enabled(false);
|
nt.log().warning.set_enabled(false);
|
||||||
|
|
||||||
netlist::factory::list_t &list = nt.setup().factory();
|
netlist::factory::list_t &list = nt.setup().factory();
|
||||||
|
|
||||||
@ -658,7 +718,48 @@ void tool_app_t::listdevices()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*-------------------------------------------------
|
||||||
|
convert - convert spice et al to netlist
|
||||||
|
-------------------------------------------------*/
|
||||||
|
|
||||||
|
void tool_app_t::convert()
|
||||||
|
{
|
||||||
|
pstring contents;
|
||||||
|
plib::postringstream ostrm;
|
||||||
|
if (opt_file() == "-")
|
||||||
|
{
|
||||||
|
plib::pstdin f;
|
||||||
|
plib::copystream(ostrm, f);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
plib::pifilestream f(opt_file());
|
||||||
|
plib::copystream(ostrm, f);
|
||||||
|
}
|
||||||
|
contents = ostrm.str();
|
||||||
|
|
||||||
|
pstring result;
|
||||||
|
if (opt_type.as_string() == "spice")
|
||||||
|
{
|
||||||
|
nl_convert_spice_t c;
|
||||||
|
c.convert(contents);
|
||||||
|
result = c.result();
|
||||||
|
}
|
||||||
|
else if (opt_type.as_string() == "eagle")
|
||||||
|
{
|
||||||
|
nl_convert_eagle_t c;
|
||||||
|
c.convert(contents);
|
||||||
|
result = c.result();
|
||||||
|
}
|
||||||
|
else if (opt_type.as_string() == "rinf")
|
||||||
|
{
|
||||||
|
nl_convert_rinf_t c;
|
||||||
|
c.convert(contents);
|
||||||
|
result = c.result();
|
||||||
|
}
|
||||||
|
/* present result */
|
||||||
|
pout.write(result);
|
||||||
|
}
|
||||||
|
|
||||||
/*-------------------------------------------------
|
/*-------------------------------------------------
|
||||||
main - primary entry point
|
main - primary entry point
|
||||||
@ -717,6 +818,8 @@ int tool_app_t::execute()
|
|||||||
listdevices();
|
listdevices();
|
||||||
else if (cmd == "run")
|
else if (cmd == "run")
|
||||||
run();
|
run();
|
||||||
|
else if (cmd == "validate")
|
||||||
|
validate();
|
||||||
else if (cmd == "static")
|
else if (cmd == "static")
|
||||||
static_compile();
|
static_compile();
|
||||||
else if (cmd == "header")
|
else if (cmd == "header")
|
||||||
@ -724,43 +827,7 @@ int tool_app_t::execute()
|
|||||||
else if (cmd == "docheader")
|
else if (cmd == "docheader")
|
||||||
create_docheader();
|
create_docheader();
|
||||||
else if (cmd == "convert")
|
else if (cmd == "convert")
|
||||||
{
|
convert();
|
||||||
pstring contents;
|
|
||||||
plib::postringstream ostrm;
|
|
||||||
if (opt_file() == "-")
|
|
||||||
{
|
|
||||||
plib::pstdin f;
|
|
||||||
plib::copystream(ostrm, f);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
plib::pifilestream f(opt_file());
|
|
||||||
plib::copystream(ostrm, f);
|
|
||||||
}
|
|
||||||
contents = ostrm.str();
|
|
||||||
|
|
||||||
pstring result;
|
|
||||||
if (opt_type.as_string() == "spice")
|
|
||||||
{
|
|
||||||
nl_convert_spice_t c;
|
|
||||||
c.convert(contents);
|
|
||||||
result = c.result();
|
|
||||||
}
|
|
||||||
else if (opt_type.as_string() == "eagle")
|
|
||||||
{
|
|
||||||
nl_convert_eagle_t c;
|
|
||||||
c.convert(contents);
|
|
||||||
result = c.result();
|
|
||||||
}
|
|
||||||
else if (opt_type.as_string() == "rinf")
|
|
||||||
{
|
|
||||||
nl_convert_rinf_t c;
|
|
||||||
c.convert(contents);
|
|
||||||
result = c.result();
|
|
||||||
}
|
|
||||||
/* present result */
|
|
||||||
pout.write(result);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
perr("Unknown command {}\n", cmd.c_str());
|
perr("Unknown command {}\n", cmd.c_str());
|
||||||
@ -772,10 +839,12 @@ int tool_app_t::execute()
|
|||||||
catch (netlist::nl_exception &e)
|
catch (netlist::nl_exception &e)
|
||||||
{
|
{
|
||||||
perr("Netlist exception caught: {}\n", e.text());
|
perr("Netlist exception caught: {}\n", e.text());
|
||||||
|
return 2;
|
||||||
}
|
}
|
||||||
catch (plib::pexception &e)
|
catch (plib::pexception &e)
|
||||||
{
|
{
|
||||||
perr("plib exception caught: {}\n", e.text());
|
perr("plib exception caught: {}\n", e.text());
|
||||||
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1709,11 +1709,11 @@ CIRCUIT_LAYOUT( breakout )
|
|||||||
//----------------------------------------------------------------
|
//----------------------------------------------------------------
|
||||||
|
|
||||||
NET_C(V5, A3.14, A4.14, A5.14, A6.14,
|
NET_C(V5, A3.14, A4.14, A5.14, A6.14,
|
||||||
B3.14, B4.16, B5.16, B6.14, B7.16, B8.16, B9.14,
|
B3.14, B4.16, B5.16, B6.14, B7.16, B8.16, B9.14,
|
||||||
C2.14, C3.14, C4.14, C5.14, C6.14, C7.16, C8.16,
|
C2.14, C3.14, C4.14, C5.14, C6.14, C7.16, C8.16,
|
||||||
D2.14, D3.14, D4.16, D5.14, D6.14, D7.14, D8.14,
|
D2.14, D3.14, D4.16, D5.14, D6.14, D7.14, D8.14,
|
||||||
E1.14, E2.14, E3.14, E4.14, E5.14, E6.14, E7.14, E8.14, E9.14,
|
E1.14, E2.14, E3.14, E4.14, E5.14, E6.14, E7.14, E8.14, E9.14,
|
||||||
F2.14, F4.14, F5.14, F6.16, F7.16, F8.14, F9.14,
|
F2.14, F4.14, F5.14, F6.16, F7.16, F8.14, F9.14,
|
||||||
H1.14, H2.14, H3.14, H4.14, H5.16, H6.16, H7.14, H8.14, H9.14,
|
H1.14, H2.14, H3.14, H4.14, H5.16, H6.16, H7.14, H8.14, H9.14,
|
||||||
J1.16, J2.14, J3.14, J4.16, J6.16, J7.14, J8.16, J9.14,
|
J1.16, J2.14, J3.14, J4.16, J6.16, J7.14, J8.16, J9.14,
|
||||||
K1.16, K2.14, K3.14, K4.14, K5.16, K6.16, K7.14, K8.14, K9.14,
|
K1.16, K2.14, K3.14, K4.14, K5.16, K6.16, K7.14, K8.14, K9.14,
|
||||||
@ -1721,11 +1721,11 @@ CIRCUIT_LAYOUT( breakout )
|
|||||||
M1.16, M2.5, M3.14, M4.14, M5.16, M6.16, M8.14, M9.14,
|
M1.16, M2.5, M3.14, M4.14, M5.16, M6.16, M8.14, M9.14,
|
||||||
N1.16, N2.5, N3.14, N4.14, N5.16, N6.16, N7.14, N9.16)
|
N1.16, N2.5, N3.14, N4.14, N5.16, N6.16, N7.14, N9.16)
|
||||||
NET_C(GND, A3.7, A4.7, A5.7, A6.7,
|
NET_C(GND, A3.7, A4.7, A5.7, A6.7,
|
||||||
B3.7, B4.8, B5.8, B6.7, B7.8, B8.8, B9.7,
|
B3.7, B4.8, B5.8, B6.7, B7.8, B8.8, B9.7,
|
||||||
C2.7, C3.7, C4.7, C5.7, C6.7, C7.8, C8.8,
|
C2.7, C3.7, C4.7, C5.7, C6.7, C7.8, C8.8,
|
||||||
D2.7, D3.7, D4.8, D5.7, D6.7, D7.7, D8.7,
|
D2.7, D3.7, D4.8, D5.7, D6.7, D7.7, D8.7,
|
||||||
E1.7, E2.7, E3.7, E4.7, E5.7, E6.7, E7.7, E8.7, E9.7,
|
E1.7, E2.7, E3.7, E4.7, E5.7, E6.7, E7.7, E8.7, E9.7,
|
||||||
F2.7, F4.7, F5.7, F6.8, F7.8, F8.7, F9.7,
|
F2.7, F4.7, F5.7, F6.8, F7.8, F8.7, F9.7,
|
||||||
H1.7, H2.7, H3.7, H4.7, H5.8, H6.8, H7.7, H8.7, H9.7,
|
H1.7, H2.7, H3.7, H4.7, H5.8, H6.8, H7.7, H8.7, H9.7,
|
||||||
J1.8, J2.7, J3.7, J4.8, J6.8, J7.7, J8.8, J9.7,
|
J1.8, J2.7, J3.7, J4.8, J6.8, J7.7, J8.8, J9.7,
|
||||||
K1.8, K2.7, K3.7, K4.7, K5.8, K6.8, K7.7, K8.7, K9.7,
|
K1.8, K2.7, K3.7, K4.7, K5.8, K6.8, K7.7, K8.7, K9.7,
|
||||||
|
@ -23,7 +23,7 @@ NETLIST_START(pong_fast)
|
|||||||
PARAM(NETLIST.USE_DEACTIVATE, 1)
|
PARAM(NETLIST.USE_DEACTIVATE, 1)
|
||||||
|
|
||||||
ANALOG_INPUT(V5, 5)
|
ANALOG_INPUT(V5, 5)
|
||||||
ALIAS(VCC, V5) // we need VCC for TTL chips
|
ALIAS(VCC, V5) // we need VCC for TTL chips
|
||||||
|
|
||||||
TTL_INPUT(high, 1)
|
TTL_INPUT(high, 1)
|
||||||
TTL_INPUT(low, 0)
|
TTL_INPUT(low, 0)
|
||||||
|
@ -1275,21 +1275,21 @@ NETLIST_START(rebound_schematics)
|
|||||||
* -----------------------------------------------------------------------*/
|
* -----------------------------------------------------------------------*/
|
||||||
|
|
||||||
NET_C(V5, A1.14,
|
NET_C(V5, A1.14,
|
||||||
B1.14, B2.14, B3.14, B4.16, B5.14, B6.16, B7.16, B8.14,
|
B1.14, B2.14, B3.14, B4.16, B5.14, B6.16, B7.16, B8.14,
|
||||||
C1.5, C2.14, C3.14, C4.16, C5.14, C6.14, C7.16, C8.14,
|
C1.5, C2.14, C3.14, C4.16, C5.14, C6.14, C7.16, C8.14,
|
||||||
D2.14, D3.16, D4.16, D5.14, D6.14, D7.14, D8.14,
|
D2.14, D3.16, D4.16, D5.14, D6.14, D7.14, D8.14,
|
||||||
E1.14, E2.5, E3.16, E4.16, E5.14, E6.14, E7.14, E8.14, E9.14,
|
E1.14, E2.5, E3.16, E4.16, E5.14, E6.14, E7.14, E8.14, E9.14,
|
||||||
F1.14, F2.14, F3.14, F4.14, F5.5, F6.14, F7.14, F8.14, F9.14,
|
F1.14, F2.14, F3.14, F4.14, F5.5, F6.14, F7.14, F8.14, F9.14,
|
||||||
H1.14, H2.14, H3.5, H4.14, H5.5, H6.14, H7.14, H8.14, H9.14,
|
H1.14, H2.14, H3.5, H4.14, H5.5, H6.14, H7.14, H8.14, H9.14,
|
||||||
J1.14, J2.14, J3.5, J4.14, J5.14, J6.14, J7.14, J8.16, J9.5,
|
J1.14, J2.14, J3.5, J4.14, J5.14, J6.14, J7.14, J8.16, J9.5,
|
||||||
K2.5, K3.16, K4.14, K5.14, K6.14, K8.16, K9.5)
|
K2.5, K3.16, K4.14, K5.14, K6.14, K8.16, K9.5)
|
||||||
NET_C(GND, A1.7,
|
NET_C(GND, A1.7,
|
||||||
B1.7, B2.7, B3.7, B4.8, B5.7, B6.8, B7.8, B8.7,
|
B1.7, B2.7, B3.7, B4.8, B5.7, B6.8, B7.8, B8.7,
|
||||||
C1.10, C2.7, C3.7, C4.8, C5.7, C6.7, C7.8, C8.7,
|
C1.10, C2.7, C3.7, C4.8, C5.7, C6.7, C7.8, C8.7,
|
||||||
D2.7, D3.8, D4.8, D5.7, D6.7, D7.7, D8.7,
|
D2.7, D3.8, D4.8, D5.7, D6.7, D7.7, D8.7,
|
||||||
E1.7, E2.12, E3.8, E4.8, E5.7, E6.7, E7.7, E8.7, E9.7,
|
E1.7, E2.12, E3.8, E4.8, E5.7, E6.7, E7.7, E8.7, E9.7,
|
||||||
F1.7, F2.7, F3.7, F4.7, F5.10, F6.7, F7.7, F8.7, F9.7,
|
F1.7, F2.7, F3.7, F4.7, F5.10, F6.7, F7.7, F8.7, F9.7,
|
||||||
H1.7, H2.7, H3.10, H4.7, H5.10, H6.7, H7.7, H8.7, H9.7,
|
H1.7, H2.7, H3.10, H4.7, H5.10, H6.7, H7.7, H8.7, H9.7,
|
||||||
J1.7, J2.7, J3.10, J4.7, J5.7, J6.7, J7.7, J8.8, J9.10,
|
J1.7, J2.7, J3.10, J4.7, J5.7, J6.7, J7.7, J8.8, J9.10,
|
||||||
K2.10, K3.8, K4.7, K5.7, K6.7, K8.8, K9.10)
|
K2.10, K3.8, K4.7, K5.7, K6.7, K8.8, K9.10)
|
||||||
NETLIST_END()
|
NETLIST_END()
|
||||||
|
Loading…
Reference in New Issue
Block a user