trunk/src/emu/netlist/nl_base.c
| r26025 | r26026 | |
| 284 | 284 | : net_terminal_t(atype) |
| 285 | 285 | , m_low_V(0.0) |
| 286 | 286 | , m_high_V(0.0) |
| 287 | | , m_last_Q(0) |
| 288 | | , m_Q(0) |
| 289 | | , m_new_Q(0) |
| 290 | | , m_Q_analog(0.0) |
| 291 | | , m_new_Q_analog(0.0) |
| 287 | //, m_last_Q(0) |
| 288 | //, m_Q(0) |
| 289 | //, m_new_Q(0) |
| 290 | //, m_Q_analog(0.0) |
| 291 | //, m_new_Q_analog(0.0) |
| 292 | 292 | , m_num_cons(0) |
| 293 | 293 | , m_time(netlist_time::zero) |
| 294 | 294 | , m_active(0) |
| 295 | 295 | , m_in_queue(2) |
| 296 | 296 | { |
| 297 | m_cur.Q = 0; |
| 298 | m_new.Q = 0; |
| 299 | m_last.Q = 0; |
| 297 | 300 | //m_cons = global_alloc_array(net_input_t *, OUTPUT_MAX_CONNECTIONS); |
| 298 | 301 | } |
| 299 | 302 | |
| r26025 | r26026 | |
| 314 | 317 | assert(m_num_cons != 0); |
| 315 | 318 | |
| 316 | 319 | const UINT32 masks[4] = { 1, 5, 3, 1 }; |
| 317 | | m_Q = m_new_Q; |
| 318 | | m_Q_analog = m_new_Q_analog; |
| 320 | m_cur = m_new; |
| 319 | 321 | m_in_queue = 2; /* mark as taken ... */ |
| 320 | 322 | |
| 321 | | const UINT32 mask = masks[ (m_last_Q << 1) | m_Q ]; |
| 323 | const UINT32 mask = masks[ (m_last.Q << 1) | m_cur.Q ]; |
| 322 | 324 | |
| 323 | 325 | switch (m_num_cons) |
| 324 | 326 | { |
| r26025 | r26026 | |
| 335 | 337 | break; |
| 336 | 338 | } |
| 337 | 339 | |
| 338 | | m_last_Q = m_Q; |
| 340 | m_last = m_cur; |
| 339 | 341 | } |
| 340 | 342 | |
| 341 | 343 | ATTR_COLD void net_output_t::register_con(net_input_t &input) |
| r26025 | r26026 | |
| 399 | 401 | m_callback(INPANALOG(m_in)); |
| 400 | 402 | } |
| 401 | 403 | |
| 402 | | // license:GPL-2.0+ |
| 403 | | // copyright-holders:Couriersud |
| 404 | 404 | // ---------------------------------------------------------------------------------------- |
| 405 | 405 | // netdev_mainclock |
| 406 | 406 | // ---------------------------------------------------------------------------------------- |
| 407 | 407 | |
| 408 | 408 | ATTR_HOT inline void NETLIB_NAME(netdev_mainclock)::mc_update(net_output_t &Q, const netlist_time curtime) |
| 409 | 409 | { |
| 410 | | Q.m_new_Q = !Q.m_new_Q; |
| 410 | Q.m_new.Q = !Q.m_new.Q; |
| 411 | 411 | Q.set_time(curtime); |
| 412 | 412 | Q.update_devs(); |
| 413 | 413 | } |
| r26025 | r26026 | |
| 429 | 429 | ATTR_HOT NETLIB_UPDATE(netdev_mainclock) |
| 430 | 430 | { |
| 431 | 431 | // this is only called during setup ... |
| 432 | | m_Q.m_new_Q = !m_Q.m_new_Q; |
| 432 | m_Q.m_new.Q = !m_Q.m_new.Q; |
| 433 | 433 | m_Q.set_time(m_netlist->time() + m_inc); |
| 434 | 434 | } |
trunk/src/emu/netlist/nl_base.h
| r26025 | r26026 | |
| 248 | 248 | { |
| 249 | 249 | public: |
| 250 | 250 | |
| 251 | typedef struct { |
| 252 | double Analog; |
| 253 | netlist_sig_t Q; |
| 254 | } hybrid_t; |
| 255 | |
| 251 | 256 | net_output_t(int atype); |
| 252 | 257 | |
| 253 | 258 | friend const netlist_sig_t logic_input_t::Q() const; |
| r26025 | r26026 | |
| 255 | 260 | friend const bool analog_input_t::is_highz() const; |
| 256 | 261 | friend class NETLIB_NAME(netdev_mainclock); |
| 257 | 262 | |
| 258 | | ATTR_HOT inline const netlist_sig_t last_Q() const { return m_last_Q; } |
| 259 | | ATTR_HOT inline const netlist_sig_t new_Q() const { return m_new_Q; } |
| 263 | ATTR_HOT inline const netlist_sig_t last_Q() const { return m_last.Q; } |
| 264 | ATTR_HOT inline const netlist_sig_t new_Q() const { return m_new.Q; } |
| 260 | 265 | |
| 261 | 266 | ATTR_COLD void register_con(net_input_t &inp); |
| 262 | 267 | |
| 263 | | ATTR_HOT inline void update_devs(); |
| 268 | /* inline not always works out */ |
| 269 | ATTR_HOT /*inline*/ void update_devs(); |
| 264 | 270 | |
| 265 | 271 | ATTR_HOT inline void inc_active(); |
| 266 | 272 | ATTR_HOT inline void dec_active(); |
| r26025 | r26026 | |
| 280 | 286 | ATTR_HOT inline const netlist_sig_t Q() const |
| 281 | 287 | { |
| 282 | 288 | assert(object_type(SIGNAL_MASK) == SIGNAL_DIGITAL); |
| 283 | | return m_Q; |
| 289 | return m_cur.Q; |
| 284 | 290 | } |
| 285 | 291 | ATTR_HOT inline const double Q_Analog() const |
| 286 | 292 | { |
| 287 | 293 | assert(object_type(SIGNAL_MASK) == SIGNAL_ANALOG); |
| 288 | | return m_Q_analog; |
| 294 | return m_cur.Analog; |
| 289 | 295 | } |
| 290 | 296 | |
| 291 | 297 | ATTR_HOT inline void push_to_queue(const netlist_time &delay); |
| 292 | 298 | |
| 293 | | netlist_sig_t m_last_Q; |
| 294 | | netlist_sig_t m_Q; |
| 295 | | netlist_sig_t m_new_Q; |
| 299 | hybrid_t m_last; |
| 300 | hybrid_t m_cur; |
| 301 | hybrid_t m_new; |
| 296 | 302 | |
| 297 | | double m_Q_analog; |
| 298 | | double m_new_Q_analog; |
| 303 | UINT32 m_num_cons; |
| 299 | 304 | |
| 300 | | UINT32 m_num_cons; |
| 301 | 305 | private: |
| 302 | 306 | ATTR_HOT void update_dev(const net_input_t *inp, const UINT32 mask); |
| 303 | 307 | |
| r26025 | r26026 | |
| 323 | 327 | m_high_V = 4.8; |
| 324 | 328 | } |
| 325 | 329 | |
| 326 | | ATTR_COLD void initial(const netlist_sig_t val) { m_Q = val; m_new_Q = val; m_last_Q = !val; } |
| 330 | ATTR_COLD void initial(const netlist_sig_t val) { m_cur.Q = val; m_new.Q = val; m_last.Q = !val; } |
| 327 | 331 | |
| 328 | 332 | ATTR_HOT inline void set_Q(const netlist_sig_t newQ, const netlist_time &delay) |
| 329 | 333 | { |
| 330 | | if (EXPECTED(newQ != m_new_Q)) |
| 334 | if (EXPECTED(newQ != m_new.Q)) |
| 331 | 335 | { |
| 332 | | m_new_Q = newQ; |
| 336 | m_new.Q = newQ; |
| 333 | 337 | if (m_num_cons) |
| 334 | 338 | push_to_queue(delay); |
| 335 | 339 | } |
| r26025 | r26026 | |
| 359 | 363 | analog_output_t() |
| 360 | 364 | : net_output_t(OUTPUT | SIGNAL_ANALOG) { } |
| 361 | 365 | |
| 362 | | ATTR_COLD void initial(const double val) { m_Q_analog = val; m_new_Q_analog = val; } |
| 366 | ATTR_COLD void initial(const double val) { m_cur.Analog = val; m_new.Analog = val; } |
| 363 | 367 | |
| 364 | 368 | ATTR_HOT inline void set_Q(const double newQ, const netlist_time &delay) |
| 365 | 369 | { |
| 366 | | if (newQ != m_new_Q_analog) |
| 370 | if (newQ != m_new.Analog) |
| 367 | 371 | { |
| 368 | | m_new_Q_analog = newQ; |
| 372 | m_new.Analog = newQ; |
| 369 | 373 | push_to_queue(delay); |
| 370 | 374 | } |
| 371 | 375 | } |
| r26025 | r26026 | |
| 716 | 720 | #if USE_DEACTIVE_DEVICE |
| 717 | 721 | if (m_active == 1 && m_in_queue > 0) |
| 718 | 722 | { |
| 719 | | m_last_Q = m_Q; |
| 723 | m_last = m_cur; |
| 720 | 724 | netdev()->inc_active(); |
| 721 | | m_Q = m_new_Q; |
| 725 | m_cur = m_new; |
| 722 | 726 | } |
| 723 | 727 | #endif |
| 724 | 728 | |
| r26025 | r26026 | |
| 731 | 735 | } |
| 732 | 736 | else |
| 733 | 737 | { |
| 734 | | m_Q = m_last_Q = m_new_Q; |
| 735 | | m_Q_analog = m_new_Q_analog; |
| 738 | m_cur = m_last = m_new; |
| 736 | 739 | m_in_queue = 2; |
| 737 | 740 | } |
| 738 | 741 | } |
trunk/src/emu/netlist/devices/nld_7420.h
| r0 | r26026 | |
| 1 | // license:GPL-2.0+ |
| 2 | // copyright-holders:Couriersud |
| 3 | /* |
| 4 | * nld_7420.h |
| 5 | * |
| 6 | * DM7420: Dual 4-Input NAND Gates |
| 7 | * |
| 8 | * +--------------+ |
| 9 | * A1 |1 ++ 14| VCC |
| 10 | * B1 |2 13| D2 |
| 11 | * NC |3 12| C2 |
| 12 | * C1 |4 7420 11| NC |
| 13 | * D1 |5 10| B2 |
| 14 | * Y! |6 9| A2 |
| 15 | * GND |7 8| Y2 |
| 16 | * +--------------+ |
| 17 | * ____ |
| 18 | * Y = ABCD |
| 19 | * +---+---+---+---++---+ |
| 20 | * | A | B | C | D || Y | |
| 21 | * +===+===+===+===++===+ |
| 22 | * | X | X | X | 0 || 1 | |
| 23 | * | X | X | 0 | X || 1 | |
| 24 | * | X | 0 | X | X || 1 | |
| 25 | * | 0 | X | X | X || 1 | |
| 26 | * | 1 | 1 | 1 | 1 || 0 | |
| 27 | * +---+---+---+---++---+ |
| 28 | * |
| 29 | * Naming conventions follow National Semiconductor datasheet |
| 30 | * |
| 31 | */ |
| 32 | |
| 33 | |
| 34 | #include "nld_signal.h" |
| 35 | |
| 36 | #ifndef NLD_7420_H_ |
| 37 | #define NLD_7420_H_ |
| 38 | |
| 39 | #define TTL_7420_NAND(_name, _I1, _I2, _I3, _I4) \ |
| 40 | NET_REGISTER_DEV(nic7420, _name) \ |
| 41 | NET_CONNECT(_name, A, _I1) \ |
| 42 | NET_CONNECT(_name, B, _I2) \ |
| 43 | NET_CONNECT(_name, C, _I3) \ |
| 44 | NET_CONNECT(_name, D, _I4) |
| 45 | |
| 46 | |
| 47 | NETLIB_SIGNAL(nic7420, 4, 0, 0); |
| 48 | |
| 49 | #endif /* NLD_7420_H_ */ |
trunk/src/emu/netlist/devices/net_lib.h
| r26025 | r26026 | |
| 57 | 57 | #include "nld_7400.h" |
| 58 | 58 | #include "nld_7402.h" |
| 59 | 59 | #include "nld_7410.h" |
| 60 | #include "nld_7420.h" |
| 60 | 61 | |
| 61 | 62 | // this is a bad hack |
| 62 | 63 | #define USE_OLD7493 (0) |
| r26025 | r26026 | |
| 104 | 105 | NET_REGISTER_DEV(nic7404, _name) \ |
| 105 | 106 | NET_CONNECT(_name, I1, _I1) |
| 106 | 107 | |
| 107 | | #define TTL_7420_NAND(_name, _I1, _I2, _I3, _I4) \ |
| 108 | | NET_REGISTER_DEV(nic7420, _name) \ |
| 109 | | NET_CONNECT(_name, A, _I1) \ |
| 110 | | NET_CONNECT(_name, B, _I2) \ |
| 111 | | NET_CONNECT(_name, C, _I3) \ |
| 112 | | NET_CONNECT(_name, D, _I4) |
| 113 | | |
| 114 | 108 | #define TTL_7425_NOR(_name, _I1, _I2, _I3, _I4) \ |
| 115 | 109 | NET_REGISTER_DEV(nic7425, _name) \ |
| 116 | 110 | NET_CONNECT(_name, A, _I1) \ |
| r26025 | r26026 | |
| 318 | 312 | net_param_t m_VL; |
| 319 | 313 | ); |
| 320 | 314 | |
| 321 | | NETLIB_SIGNAL(nic7420, 4, 0, 0); |
| 322 | 315 | NETLIB_SIGNAL(nic7425, 4, 1, 0); |
| 323 | 316 | NETLIB_SIGNAL(nic7427, 3, 1, 0); |
| 324 | 317 | NETLIB_SIGNAL(nic7430, 8, 0, 0); |