Fixed a number of bugs and some additions:

- fixed bugs in the spice(Kicad) conversion
- fixes submodel difference between inline and parsed netlist
- added truthtable 7404 and 7486 models
- aligned input and output naming for truthtable and specialised 74xx
models.
This commit is contained in:
couriersud 2015-06-07 02:08:30 +02:00
parent 887742e308
commit 5107c16ca6
27 changed files with 316 additions and 225 deletions

View File

@ -50,6 +50,7 @@ NETLIB_RESET(VCCS)
const nl_double m_mult = m_G.Value() * m_gfac; // 1.0 ==> 1V ==> 1A
const nl_double GI = NL_FCONST(1.0) / m_RI.Value();
//printf("VCCS %s RI %f\n", name().cstr(), m_RI.Value());
m_IP.set(GI);
m_IN.set(GI);

View File

@ -19,7 +19,7 @@
// ----------------------------------------------------------------------------------------
#define LM3900(_name) \
SUBMODEL(_name, opamp_lm3900)
SUBMODEL(opamp_lm3900, name)
// ----------------------------------------------------------------------------------------
// Devices ...

View File

@ -508,6 +508,9 @@ ATTR_COLD void NETLIB_NAME(solver)::post_start()
case 12:
ms = create_solver<12,12>(12, gs_threshold, use_specific);
break;
case 87:
ms = create_solver<87,87>(87, gs_threshold, use_specific);
break;
default:
if (net_count <= 16)
{
@ -521,9 +524,13 @@ ATTR_COLD void NETLIB_NAME(solver)::post_start()
{
ms = create_solver<0,64>(net_count, gs_threshold, use_specific);
}
else if (net_count <= 128)
{
ms = create_solver<0,128>(net_count, gs_threshold, use_specific);
}
else
{
netlist().error("Encountered netgroup with > 64 nets");
netlist().error("Encountered netgroup with > 128 nets");
ms = NULL; /* tease compilers */
}

View File

@ -26,20 +26,20 @@ NETLIB_START(7400_dip)
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("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("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("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("12", m_4.m_I[0]);
register_subalias("13", m_4.m_I[1]);
register_subalias("11", m_4.m_Q[0]);
}

View File

@ -27,19 +27,19 @@ NETLIB_START(7402_dip)
register_sub("4", m_4);
register_subalias("1", m_1.m_Q[0]);
register_subalias("2", m_1.m_i[0]);
register_subalias("3", m_1.m_i[1]);
register_subalias("2", m_1.m_I[0]);
register_subalias("3", m_1.m_I[1]);
register_subalias("4", m_2.m_Q[0]);
register_subalias("5", m_2.m_i[0]);
register_subalias("6", m_2.m_i[1]);
register_subalias("5", m_2.m_I[0]);
register_subalias("6", m_2.m_I[1]);
register_subalias("8", m_3.m_i[0]);
register_subalias("9", m_3.m_i[1]);
register_subalias("8", m_3.m_I[0]);
register_subalias("9", m_3.m_I[1]);
register_subalias("10", m_3.m_Q[0]);
register_subalias("11", m_4.m_i[0]);
register_subalias("12", m_4.m_i[1]);
register_subalias("11", m_4.m_I[0]);
register_subalias("12", m_4.m_I[1]);
register_subalias("13", m_4.m_Q[0]);
}

View File

@ -7,10 +7,20 @@
#include "nld_7404.h"
#if 1 && (USE_TRUTHTABLE)
nld_7404::truthtable_t nld_7404::m_ttbl;
const char *nld_7404::m_desc[] = {
"A | Q ",
"0 | 1|22",
"1 | 0|15",
""
};
#else
NETLIB_START(7404)
{
register_input("A", m_I);
register_output("Q", m_Q);
register_input("A", m_I[0]);
register_output("Q", m_Q[0]);
}
NETLIB_RESET(7404)
@ -20,9 +30,10 @@ NETLIB_RESET(7404)
NETLIB_UPDATE(7404)
{
/* static */ const netlist_time delay[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(22) };
UINT8 t = (INPLOGIC(m_I)) ^ 1;
OUTLOGIC(m_Q, t, delay[t]);
UINT8 t = (INPLOGIC(m_I[0])) ^ 1;
OUTLOGIC(m_Q[0], t, delay[t]);
}
#endif
NETLIB_START(7404_dip)
{
@ -33,23 +44,23 @@ NETLIB_START(7404_dip)
register_sub("5", m_5);
register_sub("6", m_6);
register_subalias("1", m_1.m_I);
register_subalias("2", m_1.m_Q);
register_subalias("1", m_1.m_I[0]);
register_subalias("2", m_1.m_Q[0]);
register_subalias("3", m_2.m_I);
register_subalias("4", m_2.m_Q);
register_subalias("3", m_2.m_I[0]);
register_subalias("4", m_2.m_Q[0]);
register_subalias("5", m_3.m_I);
register_subalias("6", m_3.m_Q);
register_subalias("5", m_3.m_I[0]);
register_subalias("6", m_3.m_Q[0]);
register_subalias("8", m_4.m_Q);
register_subalias("9", m_4.m_I);
register_subalias("8", m_4.m_Q[0]);
register_subalias("9", m_4.m_I[0]);
register_subalias("10", m_5.m_Q);
register_subalias("11", m_5.m_I);
register_subalias("10", m_5.m_Q[0]);
register_subalias("11", m_5.m_I[0]);
register_subalias("12", m_6.m_Q);
register_subalias("13", m_6.m_I);
register_subalias("12", m_6.m_Q[0]);
register_subalias("13", m_6.m_I[0]);
}
NETLIB_UPDATE(7404_dip)

View File

@ -32,11 +32,16 @@
#include "nld_signal.h"
#if 1 && (USE_TRUTHTABLE)
#include "nld_truthtable.h"
NETLIB_TRUTHTABLE(7404, 1, 1, 0);
#else
NETLIB_DEVICE(7404,
public:
netlist_logic_input_t m_I;
netlist_logic_output_t m_Q;
netlist_logic_input_t m_I[1];
netlist_logic_output_t m_Q[1];
);
#endif
#define TTL_7404_INVERT(_name, _A) \
NET_REGISTER_DEV(7404, _name) \

View File

@ -26,20 +26,20 @@ NETLIB_START(7408_dip)
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("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("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("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("12", m_4.m_I[0]);
register_subalias("13", m_4.m_I[1]);
register_subalias("11", m_4.m_Q[0]);
}

View File

@ -27,20 +27,20 @@ NETLIB_START(7410_dip)
register_sub("2", m_2);
register_sub("3", m_3);
register_subalias("1", m_1.m_i[0]);
register_subalias("2", m_1.m_i[1]);
register_subalias("3", m_2.m_i[0]);
register_subalias("4", m_2.m_i[1]);
register_subalias("5", m_2.m_i[2]);
register_subalias("1", m_1.m_I[0]);
register_subalias("2", m_1.m_I[1]);
register_subalias("3", m_2.m_I[0]);
register_subalias("4", m_2.m_I[1]);
register_subalias("5", m_2.m_I[2]);
register_subalias("6", m_2.m_Q[0]);
register_subalias("8", m_3.m_Q[0]);
register_subalias("9", m_3.m_i[0]);
register_subalias("10", m_3.m_i[1]);
register_subalias("11", m_3.m_i[2]);
register_subalias("9", m_3.m_I[0]);
register_subalias("10", m_3.m_I[1]);
register_subalias("11", m_3.m_I[2]);
register_subalias("12", m_1.m_Q[0]);
register_subalias("13", m_1.m_i[2]);
register_subalias("13", m_1.m_I[2]);
}
NETLIB_UPDATE(7410_dip)

View File

@ -25,20 +25,20 @@ NETLIB_START(7411_dip)
register_sub("2", m_2);
register_sub("3", m_3);
register_subalias("1", m_1.m_i[0]);
register_subalias("2", m_1.m_i[1]);
register_subalias("3", m_2.m_i[0]);
register_subalias("4", m_2.m_i[1]);
register_subalias("5", m_2.m_i[2]);
register_subalias("1", m_1.m_I[0]);
register_subalias("2", m_1.m_I[1]);
register_subalias("3", m_2.m_I[0]);
register_subalias("4", m_2.m_I[1]);
register_subalias("5", m_2.m_I[2]);
register_subalias("6", m_2.m_Q[0]);
register_subalias("8", m_3.m_Q[0]);
register_subalias("9", m_3.m_i[0]);
register_subalias("10", m_3.m_i[1]);
register_subalias("11", m_3.m_i[2]);
register_subalias("9", m_3.m_I[0]);
register_subalias("10", m_3.m_I[1]);
register_subalias("11", m_3.m_I[2]);
register_subalias("12", m_1.m_Q[0]);
register_subalias("13", m_1.m_i[2]);
register_subalias("13", m_1.m_I[2]);
}
NETLIB_UPDATE(7411_dip)

View File

@ -25,19 +25,19 @@ NETLIB_START(7420_dip)
register_sub("1", m_1);
register_sub("2", m_2);
register_subalias("1", m_1.m_i[0]);
register_subalias("2", m_1.m_i[1]);
register_subalias("1", m_1.m_I[0]);
register_subalias("2", m_1.m_I[1]);
register_subalias("4", m_1.m_i[2]);
register_subalias("5", m_1.m_i[3]);
register_subalias("4", m_1.m_I[2]);
register_subalias("5", m_1.m_I[3]);
register_subalias("6", m_1.m_Q[0]);
register_subalias("8", m_2.m_Q[0]);
register_subalias("9", m_2.m_i[0]);
register_subalias("10", m_2.m_i[1]);
register_subalias("9", m_2.m_I[0]);
register_subalias("10", m_2.m_I[1]);
register_subalias("12", m_2.m_i[2]);
register_subalias("13", m_2.m_i[3]);
register_subalias("12", m_2.m_I[2]);
register_subalias("13", m_2.m_I[3]);
}

View File

@ -12,23 +12,23 @@ NETLIB_START(7425_dip)
register_sub("1", m_1);
register_sub("2", m_2);
register_subalias("1", m_1.m_i[0]);
register_subalias("2", m_1.m_i[1]);
register_subalias("1", m_1.m_I[0]);
register_subalias("2", m_1.m_I[1]);
//register_subalias("3", ); X1 ==> NC
register_subalias("4", m_1.m_i[2]);
register_subalias("5", m_1.m_i[3]);
register_subalias("4", m_1.m_I[2]);
register_subalias("5", m_1.m_I[3]);
register_subalias("6", m_1.m_Q[0]);
register_subalias("8", m_2.m_Q[0]);
register_subalias("9", m_2.m_i[0]);
register_subalias("10", m_2.m_i[1]);
register_subalias("9", m_2.m_I[0]);
register_subalias("10", m_2.m_I[1]);
//register_subalias("11", ); X2 ==> NC
register_subalias("12", m_2.m_i[2]);
register_subalias("13", m_2.m_i[3]);
register_subalias("12", m_2.m_I[2]);
register_subalias("13", m_2.m_I[3]);
}

View File

@ -27,20 +27,20 @@ NETLIB_START(7427_dip)
register_sub("2", m_2);
register_sub("3", m_3);
register_subalias("1", m_1.m_i[0]);
register_subalias("2", m_1.m_i[1]);
register_subalias("3", m_2.m_i[0]);
register_subalias("4", m_2.m_i[1]);
register_subalias("5", m_2.m_i[2]);
register_subalias("1", m_1.m_I[0]);
register_subalias("2", m_1.m_I[1]);
register_subalias("3", m_2.m_I[0]);
register_subalias("4", m_2.m_I[1]);
register_subalias("5", m_2.m_I[2]);
register_subalias("6", m_2.m_Q[0]);
register_subalias("8", m_3.m_Q[0]);
register_subalias("9", m_3.m_i[0]);
register_subalias("10", m_3.m_i[1]);
register_subalias("11", m_3.m_i[2]);
register_subalias("9", m_3.m_I[0]);
register_subalias("10", m_3.m_I[1]);
register_subalias("11", m_3.m_I[2]);
register_subalias("12", m_1.m_Q[0]);
register_subalias("13", m_1.m_i[2]);
register_subalias("13", m_1.m_I[2]);
}
NETLIB_UPDATE(7427_dip)

View File

@ -125,23 +125,23 @@ NETLIB_START(74279_dip)
register_sub("3", m_3);
register_sub("4", m_4);
register_subalias("1", m_1.m_i[2]); //R
register_subalias("2", m_1.m_i[0]);
register_subalias("3", m_1.m_i[1]);
register_subalias("1", m_1.m_I[2]); //R
register_subalias("2", m_1.m_I[0]);
register_subalias("3", m_1.m_I[1]);
register_subalias("4", m_1.m_Q[0]);
register_subalias("5", m_2.m_i[1]); //R
register_subalias("6", m_2.m_i[0]);
register_subalias("5", m_2.m_I[1]); //R
register_subalias("6", m_2.m_I[0]);
register_subalias("7", m_2.m_Q[0]);
register_subalias("9", m_3.m_Q[0]);
register_subalias("10", m_3.m_i[2]); //R
register_subalias("11", m_3.m_i[0]);
register_subalias("12", m_3.m_i[1]);
register_subalias("10", m_3.m_I[2]); //R
register_subalias("11", m_3.m_I[0]);
register_subalias("12", m_3.m_I[1]);
register_subalias("13", m_4.m_Q[0]);
register_subalias("14", m_4.m_i[1]); //R
register_subalias("15", m_4.m_i[0]);
register_subalias("14", m_4.m_I[1]); //R
register_subalias("15", m_4.m_I[0]);
}
NETLIB_UPDATE(74279_dip)

View File

@ -30,17 +30,17 @@ NETLIB_START(7430_dip)
{
register_sub("1", m_1);
register_subalias("1", m_1.m_i[0]);
register_subalias("2", m_1.m_i[1]);
register_subalias("3", m_1.m_i[2]);
register_subalias("4", m_1.m_i[3]);
register_subalias("5", m_1.m_i[4]);
register_subalias("6", m_1.m_i[5]);
register_subalias("1", m_1.m_I[0]);
register_subalias("2", m_1.m_I[1]);
register_subalias("3", m_1.m_I[2]);
register_subalias("4", m_1.m_I[3]);
register_subalias("5", m_1.m_I[4]);
register_subalias("6", m_1.m_I[5]);
register_subalias("8", m_1.m_Q[0]);
register_subalias("11", m_1.m_i[6]);
register_subalias("12", m_1.m_i[7]);
register_subalias("11", m_1.m_I[6]);
register_subalias("12", m_1.m_I[7]);
}
NETLIB_UPDATE(7430_dip)

View File

@ -27,19 +27,19 @@ NETLIB_START(7432_dip)
register_sub("4", m_4);
register_subalias("3", m_1.m_Q[0]);
register_subalias("1", m_1.m_i[0]);
register_subalias("2", m_1.m_i[1]);
register_subalias("1", m_1.m_I[0]);
register_subalias("2", m_1.m_I[1]);
register_subalias("6", m_2.m_Q[0]);
register_subalias("4", m_2.m_i[0]);
register_subalias("5", m_2.m_i[1]);
register_subalias("4", m_2.m_I[0]);
register_subalias("5", m_2.m_I[1]);
register_subalias("9", m_3.m_i[0]);
register_subalias("10", m_3.m_i[1]);
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("12", m_4.m_I[0]);
register_subalias("13", m_4.m_I[1]);
register_subalias("11", m_4.m_Q[0]);
}

View File

@ -26,20 +26,20 @@ NETLIB_START(7437_dip)
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("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("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("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("12", m_4.m_I[0]);
register_subalias("13", m_4.m_I[1]);
register_subalias("11", m_4.m_Q[0]);
}

View File

@ -7,11 +7,22 @@
#include "nld_7486.h"
#if (USE_TRUTHTABLE)
nld_7486::truthtable_t nld_7486::m_ttbl;
const char *nld_7486::m_desc[] = {
"A , B | Q ",
"0,0|0|15",
"0,1|1|22",
"1,0|1|22",
"1,1|0|15",
""
};
#else
NETLIB_START(7486)
{
register_input("A", m_A);
register_input("B", m_B);
register_output("Q", m_Q);
register_input("A", m_I[0]);
register_input("B", m_I[1]);
register_output("Q", m_Q[0]);
save(NLNAME(m_active));
}
@ -25,10 +36,41 @@ NETLIB_UPDATE(7486)
{
const netlist_time delay[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(22) };
UINT8 t = INPLOGIC(m_A) ^ INPLOGIC(m_B);
OUTLOGIC(m_Q, t, delay[t]);
UINT8 t = INPLOGIC(m_I[0]) ^ INPLOGIC(m_I[1]);
OUTLOGIC(m_Q[0], t, delay[t]);
}
ATTR_HOT void NETLIB_NAME(7486)::inc_active()
{
const netlist_time delay[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(22) };
nl_assert(netlist().use_deactivate());
if (++m_active == 1)
{
m_I[0].activate();
m_I[1].activate();
netlist_time mt = this->m_I[0].net().time();
if (this->m_I[1].net().time() > mt)
mt = this->m_I[1].net().time();
UINT8 t = INPLOGIC(m_I[0]) ^ INPLOGIC(m_I[1]);
m_Q[0].net().set_Q_time(t, mt + delay[t]);
}
}
ATTR_HOT void NETLIB_NAME(7486)::dec_active()
{
#if 1
nl_assert(netlist().use_deactivate());
if (--m_active == 0)
{
m_I[0].inactivate();
m_I[1].inactivate();
}
#endif
}
#endif
NETLIB_START(7486_dip)
{
register_sub("1", m_1);
@ -36,21 +78,21 @@ NETLIB_START(7486_dip)
register_sub("3", m_3);
register_sub("4", m_4);
register_subalias("1", m_1.m_A);
register_subalias("2", m_1.m_B);
register_subalias("3", m_1.m_Q);
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_A);
register_subalias("5", m_2.m_B);
register_subalias("6", m_2.m_Q);
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_A);
register_subalias("10", m_3.m_B);
register_subalias("8", m_3.m_Q);
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_A);
register_subalias("13", m_4.m_B);
register_subalias("11", m_4.m_Q);
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(7486_dip)
@ -70,32 +112,3 @@ NETLIB_RESET(7486_dip)
m_4.do_reset();
}
ATTR_HOT void NETLIB_NAME(7486)::inc_active()
{
const netlist_time delay[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(22) };
nl_assert(netlist().use_deactivate());
if (++m_active == 1)
{
m_A.activate();
m_B.activate();
netlist_time mt = this->m_A.net().time();
if (this->m_B.net().time() > mt)
mt = this->m_B.net().time();
UINT8 t = INPLOGIC(m_A) ^ INPLOGIC(m_B);
m_Q.net().set_Q_time(t, mt + delay[t]);
}
}
ATTR_HOT void NETLIB_NAME(7486)::dec_active()
{
#if 1
nl_assert(netlist().use_deactivate());
if (--m_active == 0)
{
m_A.inactivate();
m_B.inactivate();
}
#endif
}

View File

@ -39,16 +39,20 @@
NET_CONNECT(_name, A, _A) \
NET_CONNECT(_name, B, _B)
#if (USE_TRUTHTABLE)
#include "nld_truthtable.h"
NETLIB_TRUTHTABLE(7486, 2, 1, 0);
#else
NETLIB_DEVICE(7486,
public:
netlist_logic_input_t m_A;
netlist_logic_input_t m_B;
netlist_logic_output_t m_Q;
netlist_logic_input_t m_I[2];
netlist_logic_output_t m_Q[1];
ATTR_HOT void inc_active();
ATTR_HOT void dec_active();
int m_active;
);
#endif
#define TTL_7486_DIP(_name) \
NET_REGISTER_DEV(7486_dip, _name)

View File

@ -128,19 +128,19 @@ NETLIB_START(9312_dip)
#if (1 && USE_TRUTHTABLE)
register_subalias("13", m_sub.m_i[0]);
register_subalias("12", m_sub.m_i[1]);
register_subalias("11", m_sub.m_i[2]);
register_subalias("10", m_sub.m_i[3]);
register_subalias("13", m_sub.m_I[0]);
register_subalias("12", m_sub.m_I[1]);
register_subalias("11", m_sub.m_I[2]);
register_subalias("10", m_sub.m_I[3]);
register_subalias("1", m_sub.m_i[4]);
register_subalias("2", m_sub.m_i[5]);
register_subalias("3", m_sub.m_i[6]);
register_subalias("4", m_sub.m_i[7]);
register_subalias("5", m_sub.m_i[8]);
register_subalias("6", m_sub.m_i[9]);
register_subalias("7", m_sub.m_i[10]);
register_subalias("9", m_sub.m_i[11]);
register_subalias("1", m_sub.m_I[4]);
register_subalias("2", m_sub.m_I[5]);
register_subalias("3", m_sub.m_I[6]);
register_subalias("4", m_sub.m_I[7]);
register_subalias("5", m_sub.m_I[8]);
register_subalias("6", m_sub.m_I[9]);
register_subalias("7", m_sub.m_I[10]);
register_subalias("9", m_sub.m_I[11]);
register_subalias("15", m_sub.m_Q[0]); // Y
register_subalias("14", m_sub.m_Q[1]); // YQ

View File

@ -42,7 +42,7 @@ public:
register_output("Q", m_Q[0]);
for (int i=0; i < _numdev; i++)
{
register_input(sIN[i], m_i[i]);
register_input(sIN[i], m_I[i]);
}
save(NLNAME(m_active));
}
@ -57,13 +57,13 @@ public:
{
for (int i = 0; i< _numdev; i++)
{
this->m_i[i].activate();
if (INPLOGIC(this->m_i[i]) == _check)
this->m_I[i].activate();
if (INPLOGIC(this->m_I[i]) == _check)
{
for (int j = 0; j < i; j++)
this->m_i[j].inactivate();
this->m_I[j].inactivate();
for (int j = i + 1; j < _numdev; j++)
this->m_i[j].inactivate();
this->m_I[j].inactivate();
return _check ^ (1 ^ _invert);
}
}
@ -80,8 +80,8 @@ public:
netlist_time mt = netlist_time::zero;
for (int i = 0; i< _numdev; i++)
{
if (this->m_i[i].net().time() > mt)
mt = this->m_i[i].net().time();
if (this->m_I[i].net().time() > mt)
mt = this->m_I[i].net().time();
}
netlist_sig_t r = process();
m_Q[0].net().set_Q_time(r, mt + times[r]);
@ -94,7 +94,7 @@ public:
if (--m_active == 0)
{
for (int i = 0; i< _numdev; i++)
m_i[i].inactivate();
m_I[i].inactivate();
}
}
@ -107,7 +107,7 @@ public:
}
public:
netlist_logic_input_t m_i[_numdev];
netlist_logic_input_t m_I[_numdev];
netlist_logic_output_t m_Q[1];
INT32 m_active;
};

View File

@ -121,7 +121,7 @@ public:
for (unsigned i=0; i < m_NI; i++)
{
inout[i] = inout[i].trim();
register_input(inout[i], m_i[i]);
register_input(inout[i], m_I[i]);
}
for (unsigned i=0; i < m_NO; i++)
{
@ -138,7 +138,7 @@ public:
if (idx>=0)
{
//printf("connecting %s %d\n", out[i].cstr(), idx);
connect(m_Q[i], m_i[idx]);
connect(m_Q[i], m_I[idx]);
// disable ignore for this inputs altogether.
// FIXME: This shouldn't be necessary
disabled_ignore |= (1<<idx);
@ -167,7 +167,7 @@ public:
m_active = 0;
m_ign = 0;
for (unsigned i = 0; i < m_NI; i++)
m_i[i].activate();
m_I[i].activate();
for (unsigned i=0; i<m_NO;i++)
if (this->m_Q[i].net().num_cons()>0)
m_active++;
@ -183,26 +183,27 @@ public:
for (unsigned i = 0; i < m_NI; i++)
{
if (!doOUT || (m_ign & (1<<i)))
m_i[i].activate();
m_I[i].activate();
}
for (unsigned i = 0; i < m_NI; i++)
{
state |= (INPLOGIC(m_i[i]) << i);
state |= (INPLOGIC(m_I[i]) << i);
if (!doOUT)
if (this->m_i[i].net().time() > mt)
mt = this->m_i[i].net().time();
if (this->m_I[i].net().time() > mt)
mt = this->m_I[i].net().time();
}
const UINT32 nstate = state | (has_state ? (m_last_state << m_NI) : 0);
const UINT32 out = m_ttp->m_outs[nstate] & ((1 << m_NO) - 1);
m_ign = m_ttp->m_outs[nstate] >> m_NO;
const UINT32 outstate = m_ttp->m_outs[nstate];
const UINT32 out = outstate & ((1 << m_NO) - 1);
m_ign = outstate >> m_NO;
if (has_state)
m_last_state = (state << m_NO) | out;
#if 0
for (int i = 0; i < m_NI; i++)
if (m_ign & (1 << i))
m_i[i].inactivate();
m_I[i].inactivate();
#endif
const UINT32 timebase = nstate * m_NO;
if (doOUT)
@ -214,10 +215,12 @@ public:
for (unsigned i = 0; i < m_NO; i++)
m_Q[i].net().set_Q_time((out >> i) & 1, mt + m_ttp->m_timing_nt[m_ttp->m_timing[timebase + i]]);
for (unsigned i = 0; i < m_NI; i++)
if (m_ign & (1 << i))
m_i[i].inactivate();
if (m_NI > 1 || has_state)
{
for (unsigned i = 0; i < m_NI; i++)
if (m_ign & (1 << i))
m_I[i].inactivate();
}
}
ATTR_HOT void update()
@ -238,16 +241,24 @@ public:
ATTR_HOT void dec_active()
{
nl_assert(netlist().use_deactivate());
/* FIXME:
* Based on current measurements there is no point to disable
* 1 input devices. This should actually be a parameter so that we
* can decide for each individual gate whether it is benefitial to
* ignore deactivation.
*/
if (m_NI < 2)
return;
if (has_state == 0)
if (--m_active == 0)
{
for (unsigned i = 0; i< m_NI; i++)
m_i[i].inactivate();
m_I[i].inactivate();
m_ign = (1<<m_NI)-1;
}
}
netlist_logic_input_t m_i[m_NI];
netlist_logic_input_t m_I[m_NI];
netlist_logic_output_t m_Q[m_NO];
private:

View File

@ -207,13 +207,13 @@ void netlist_parser::net_model()
void netlist_parser::net_submodel()
{
// don't do much
pstring name = get_identifier();
require_token(m_tok_comma);
pstring model = get_identifier();
require_token(m_tok_comma);
pstring name = get_identifier();
require_token(m_tok_param_right);
m_setup.namespace_push(name);
m_setup.include(name);
m_setup.include(model);
m_setup.namespace_pop();
}
@ -236,7 +236,7 @@ void netlist_parser::net_local_source()
void netlist_parser::net_alias()
{
pstring alias = get_identifier();
pstring alias = get_identifier_or_number();
require_token(m_tok_comma);

View File

@ -63,7 +63,7 @@ ATTR_COLD void NETLIST_NAME(_name)(netlist_setup_t &setup)
#define INCLUDE(_name) \
setup.include(# _name);
#define SUBMODEL(_name, _model) \
#define SUBMODEL(_model, _name) \
setup.namespace_push(# _name); \
NETLIST_NAME(_model)(setup); \
setup.namespace_pop();

View File

@ -97,6 +97,16 @@ pstring ptokenizer::get_identifier()
return tok.str();
}
pstring ptokenizer::get_identifier_or_number()
{
token_t tok = get_token();
if (!(tok.is_type(IDENTIFIER) || tok.is_type(NUMBER)))
{
error("Error: expected an identifier, got <%s>\n", tok.str().cstr());
}
return tok.str();
}
double ptokenizer::get_number_double()
{
token_t tok = get_token();

View File

@ -86,6 +86,7 @@ public:
token_t get_token();
pstring get_string();
pstring get_identifier();
pstring get_identifier_or_number();
double get_number_double();
long get_number_long();

View File

@ -230,22 +230,43 @@ void nl_convert_spice_t::process_line(const pstring &line)
/* check for fourth terminal ... should be numeric net
* including "0" or start with "N" (ltspice)
*/
// FIXME: we need a is_long method ..
ATTR_UNUSED int nval =tt[4].as_long(&cerr);
pstring model;
pstring pins ="CBE";
if ((!cerr || tt[4].startsWith("N")) && tt.size() > 5)
add_device("QBJT", tt[0], tt[5]);
model = tt[5];
else
add_device("QBJT", tt[0], tt[4]);
add_term(tt[1], tt[0] + ".C");
add_term(tt[2], tt[0] + ".B");
add_term(tt[3], tt[0] + ".E");
model = tt[4];
pstring_list_t m(model,"{");
if (m.size() == 2)
{
if (m[1].len() != 4)
fprintf(stderr, "error with model desc %s\n", model.cstr());
pins = m[1].left(3);
}
add_device("QBJT_EB", tt[0], m[0]);
add_term(tt[1], tt[0] + "." + pins[0]);
add_term(tt[2], tt[0] + "." + pins[1]);
add_term(tt[3], tt[0] + "." + pins[2]);
}
break;
case 'R':
val = get_sp_val(tt[3]);
add_device("RES", tt[0], val);
add_term(tt[1], tt[0] + ".1");
add_term(tt[2], tt[0] + ".2");
if (tt[0].startsWith("RV"))
{
val = get_sp_val(tt[4]);
add_device("POT", tt[0], val);
add_term(tt[1], tt[0] + ".1");
add_term(tt[2], tt[0] + ".2");
add_term(tt[3], tt[0] + ".3");
}
else
{
val = get_sp_val(tt[3]);
add_device("RES", tt[0], val);
add_term(tt[1], tt[0] + ".1");
add_term(tt[2], tt[0] + ".2");
}
break;
case 'C':
val = get_sp_val(tt[3]);
@ -265,11 +286,18 @@ void nl_convert_spice_t::process_line(const pstring &line)
else
fprintf(stderr, "Voltage Source %s not connected to GND\n", tt[0].cstr());
break;
case 'I': // Input pin special notation
{
val = get_sp_val(tt[2]);
add_device("ANALOG_INPUT", tt[0], val);
add_term(tt[1], tt[0] + ".Q");
}
break;
case 'D':
// FIXME: Rewrite resistor value
add_device("DIODE", tt[0], tt[3]);
add_term(tt[1], tt[0] + ".A");
add_term(tt[2], tt[0] + ".K");
/* FIXME ==> does Kicad use different notation from LTSPICE */
add_term(tt[1], tt[0] + ".K");
add_term(tt[2], tt[0] + ".A");
break;
case 'U':
case 'X':