mirror of
https://github.com/holub/mame
synced 2025-04-23 00:39:36 +03:00
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:
parent
887742e308
commit
5107c16ca6
@ -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);
|
||||
|
||||
|
@ -19,7 +19,7 @@
|
||||
// ----------------------------------------------------------------------------------------
|
||||
|
||||
#define LM3900(_name) \
|
||||
SUBMODEL(_name, opamp_lm3900)
|
||||
SUBMODEL(opamp_lm3900, name)
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
// Devices ...
|
||||
|
@ -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 */
|
||||
}
|
||||
|
||||
|
@ -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]);
|
||||
}
|
||||
|
||||
|
@ -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]);
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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) \
|
||||
|
@ -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]);
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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]);
|
||||
|
||||
}
|
||||
|
||||
|
@ -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]);
|
||||
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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]);
|
||||
}
|
||||
|
||||
|
@ -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]);
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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:
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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':
|
||||
|
Loading…
Reference in New Issue
Block a user