diff options
Diffstat (limited to 'src/emu/netlist/nl_base.h')
-rw-r--r-- | src/emu/netlist/nl_base.h | 1236 |
1 files changed, 618 insertions, 618 deletions
diff --git a/src/emu/netlist/nl_base.h b/src/emu/netlist/nl_base.h index 97c229e0dd2..f6a768040d4 100644 --- a/src/emu/netlist/nl_base.h +++ b/src/emu/netlist/nl_base.h @@ -190,49 +190,49 @@ typedef void (*net_update_delegate)(netlist_core_device_t *); #define NETLIB_UPDATEI() ATTR_HOT ATTR_ALIGN inline void update(void) #define NETLIB_DEVICE_BASE(_name, _pclass, _extra, _priv) \ - class _name : public _pclass \ - { \ - public: \ - _name() \ - : _pclass() { } \ - protected: \ - _extra \ - ATTR_HOT void update(); \ - ATTR_HOT void start(); \ - ATTR_HOT void reset(); \ - _priv \ - } + class _name : public _pclass \ + { \ + public: \ + _name() \ + : _pclass() { } \ + protected: \ + _extra \ + ATTR_HOT void update(); \ + ATTR_HOT void start(); \ + ATTR_HOT void reset(); \ + _priv \ + } #define NETLIB_DEVICE_DERIVED(_name, _pclass, _priv) \ - NETLIB_DEVICE_BASE(NETLIB_NAME(_name), NETLIB_NAME(_pclass), , _priv) + NETLIB_DEVICE_BASE(NETLIB_NAME(_name), NETLIB_NAME(_pclass), , _priv) #define NETLIB_DEVICE(_name, _priv) \ - NETLIB_DEVICE_BASE(NETLIB_NAME(_name), netlist_device_t, , _priv) + NETLIB_DEVICE_BASE(NETLIB_NAME(_name), netlist_device_t, , _priv) #define NETLIB_SUBDEVICE(_name, _priv) \ - class NETLIB_NAME(_name) : public netlist_device_t \ - { \ - public: \ - NETLIB_NAME(_name) () \ - : netlist_device_t() \ - { } \ - /*protected:*/ \ - ATTR_HOT void update(); \ - ATTR_HOT void start(); \ - ATTR_HOT void reset(); \ - public: \ - _priv \ - } + class NETLIB_NAME(_name) : public netlist_device_t \ + { \ + public: \ + NETLIB_NAME(_name) () \ + : netlist_device_t() \ + { } \ + /*protected:*/ \ + ATTR_HOT void update(); \ + ATTR_HOT void start(); \ + ATTR_HOT void reset(); \ + public: \ + _priv \ + } #define NETLIB_DEVICE_WITH_PARAMS(_name, _priv) \ - NETLIB_DEVICE_BASE(NETLIB_NAME(_name), netlist_device_t, \ - ATTR_HOT void update_param(); \ - , _priv) + NETLIB_DEVICE_BASE(NETLIB_NAME(_name), netlist_device_t, \ + ATTR_HOT void update_param(); \ + , _priv) #define NETLIB_DEVICE_WITH_PARAMS_DERIVED(_name, _pclass, _priv) \ - NETLIB_DEVICE_BASE(NETLIB_NAME(_name), NETLIB_NAME(_pclass), \ - ATTR_HOT void update_param(); \ - , _priv) + NETLIB_DEVICE_BASE(NETLIB_NAME(_name), NETLIB_NAME(_pclass), \ + ATTR_HOT void update_param(); \ + , _priv) // ---------------------------------------------------------------------------------------- // forward definitions @@ -255,12 +255,12 @@ class NETLIB_NAME(base_d_to_a_proxy); struct netlist_logic_family_desc_t { - double m_low_thresh_V; - double m_high_thresh_V; - double m_low_V; - double m_high_V; - double m_R_low; - double m_R_high; + double m_low_thresh_V; + double m_high_thresh_V; + double m_low_V; + double m_high_V; + double m_R_low; + double m_R_high; }; /* Terminals inherit the family description from the netlist_device @@ -278,69 +278,69 @@ extern netlist_logic_family_desc_t netlist_family_ttl; class netlist_object_t { - NETLIST_PREVENT_COPYING(netlist_object_t) + NETLIST_PREVENT_COPYING(netlist_object_t) public: - enum type_t { - TERMINAL = 0, - INPUT = 1, - OUTPUT = 2, - PARAM = 3, - NET = 4, - DEVICE = 5, - NETLIST = 6, - }; - enum family_t { - // Terminal families - LOGIC = 1, - ANALOG = 2, - // Device families - GENERIC = 3, // <== devices usually fall into this category - RESISTOR = 4, // Resistor - CAPACITOR = 5, // Capacitor - DIODE = 6, // Diode - BJT_SWITCH = 7, // BJT(Switch) - VCVS = 8, // Voltage controlled voltage source - VCCS = 9, // Voltage controlled voltage source - BJT_EB = 10, // BJT(Ebers-Moll) - GND = 11, // BJT(Ebers-Moll) - }; - - ATTR_COLD netlist_object_t(const type_t atype, const family_t afamily); - - virtual ~netlist_object_t(); - - ATTR_COLD void init_object(netlist_base_t &nl, const pstring &aname); - ATTR_COLD bool isInitalized() { return (m_netlist != NULL); } - - ATTR_COLD const pstring name() const; - - PSTATE_INTERFACE_DECL() - - ATTR_HOT inline const type_t type() const { return m_objtype; } - ATTR_HOT inline const family_t family() const { return m_family; } - - ATTR_HOT inline const bool isType(const type_t atype) const { return (m_objtype == atype); } - ATTR_HOT inline const bool isFamily(const family_t afamily) const { return (m_family == afamily); } - - ATTR_HOT inline netlist_base_t & RESTRICT netlist() { return *m_netlist; } - ATTR_HOT inline const netlist_base_t & RESTRICT netlist() const { return *m_netlist; } - - ATTR_COLD void inline do_reset() - { - reset(); - } + enum type_t { + TERMINAL = 0, + INPUT = 1, + OUTPUT = 2, + PARAM = 3, + NET = 4, + DEVICE = 5, + NETLIST = 6, + }; + enum family_t { + // Terminal families + LOGIC = 1, + ANALOG = 2, + // Device families + GENERIC = 3, // <== devices usually fall into this category + RESISTOR = 4, // Resistor + CAPACITOR = 5, // Capacitor + DIODE = 6, // Diode + BJT_SWITCH = 7, // BJT(Switch) + VCVS = 8, // Voltage controlled voltage source + VCCS = 9, // Voltage controlled voltage source + BJT_EB = 10, // BJT(Ebers-Moll) + GND = 11, // BJT(Ebers-Moll) + }; + + ATTR_COLD netlist_object_t(const type_t atype, const family_t afamily); + + virtual ~netlist_object_t(); + + ATTR_COLD void init_object(netlist_base_t &nl, const pstring &aname); + ATTR_COLD bool isInitalized() { return (m_netlist != NULL); } + + ATTR_COLD const pstring name() const; + + PSTATE_INTERFACE_DECL() + + ATTR_HOT inline const type_t type() const { return m_objtype; } + ATTR_HOT inline const family_t family() const { return m_family; } + + ATTR_HOT inline const bool isType(const type_t atype) const { return (m_objtype == atype); } + ATTR_HOT inline const bool isFamily(const family_t afamily) const { return (m_family == afamily); } + + ATTR_HOT inline netlist_base_t & RESTRICT netlist() { return *m_netlist; } + ATTR_HOT inline const netlist_base_t & RESTRICT netlist() const { return *m_netlist; } + + ATTR_COLD void inline do_reset() + { + reset(); + } protected: - ATTR_COLD virtual void reset() = 0; - // must call parent save_register ! - ATTR_COLD virtual void save_register() { }; + ATTR_COLD virtual void reset() = 0; + // must call parent save_register ! + ATTR_COLD virtual void save_register() { }; private: - pstring m_name; - const type_t m_objtype; - const family_t m_family; - netlist_base_t * RESTRICT m_netlist; + pstring m_name; + const type_t m_objtype; + const family_t m_family; + netlist_base_t * RESTRICT m_netlist; }; // ---------------------------------------------------------------------------------------- @@ -349,15 +349,15 @@ private: class netlist_owned_object_t : public netlist_object_t { - NETLIST_PREVENT_COPYING(netlist_owned_object_t) + NETLIST_PREVENT_COPYING(netlist_owned_object_t) public: - ATTR_COLD netlist_owned_object_t(const type_t atype, const family_t afamily); + ATTR_COLD netlist_owned_object_t(const type_t atype, const family_t afamily); - ATTR_COLD void init_object(netlist_core_device_t &dev, const pstring &aname); + ATTR_COLD void init_object(netlist_core_device_t &dev, const pstring &aname); - ATTR_HOT inline netlist_core_device_t & RESTRICT netdev() const { return *m_netdev; } + ATTR_HOT inline netlist_core_device_t & RESTRICT netdev() const { return *m_netdev; } private: - netlist_core_device_t * RESTRICT m_netdev; + netlist_core_device_t * RESTRICT m_netdev; }; // ---------------------------------------------------------------------------------------- @@ -366,53 +366,53 @@ private: class netlist_core_terminal_t : public netlist_owned_object_t, public plinked_list_element<netlist_core_terminal_t> { - NETLIST_PREVENT_COPYING(netlist_core_terminal_t) + NETLIST_PREVENT_COPYING(netlist_core_terminal_t) public: - typedef netlist_list_t<netlist_core_terminal_t *> list_t; + typedef netlist_list_t<netlist_core_terminal_t *> list_t; - /* needed here ... */ + /* needed here ... */ - enum state_e { - STATE_INP_PASSIVE = 0, - STATE_INP_ACTIVE = 1, - STATE_INP_HL = 2, - STATE_INP_LH = 4, - STATE_OUT = 128, - STATE_NONEX = 256 - }; + enum state_e { + STATE_INP_PASSIVE = 0, + STATE_INP_ACTIVE = 1, + STATE_INP_HL = 2, + STATE_INP_LH = 4, + STATE_OUT = 128, + STATE_NONEX = 256 + }; - ATTR_COLD netlist_core_terminal_t(const type_t atype, const family_t afamily); + ATTR_COLD netlist_core_terminal_t(const type_t atype, const family_t afamily); - //ATTR_COLD void init_object(netlist_core_device_t &dev, const pstring &aname); + //ATTR_COLD void init_object(netlist_core_device_t &dev, const pstring &aname); - ATTR_COLD void set_net(netlist_net_t &anet); - ATTR_COLD inline void clear_net() { m_net = NULL; } - ATTR_HOT inline bool has_net() const { return (m_net != NULL); } - ATTR_HOT inline const netlist_net_t & RESTRICT net() const { return *m_net;} - ATTR_HOT inline netlist_net_t & RESTRICT net() { return *m_net;} + ATTR_COLD void set_net(netlist_net_t &anet); + ATTR_COLD inline void clear_net() { m_net = NULL; } + ATTR_HOT inline bool has_net() const { return (m_net != NULL); } + ATTR_HOT inline const netlist_net_t & RESTRICT net() const { return *m_net;} + ATTR_HOT inline netlist_net_t & RESTRICT net() { return *m_net;} - ATTR_HOT inline const bool is_state(const state_e astate) const { return (m_state == astate); } - ATTR_HOT inline const state_e state() const { return m_state; } - ATTR_HOT inline void set_state(const state_e astate) - { - assert(astate != STATE_NONEX); - m_state = astate; - } + ATTR_HOT inline const bool is_state(const state_e astate) const { return (m_state == astate); } + ATTR_HOT inline const state_e state() const { return m_state; } + ATTR_HOT inline void set_state(const state_e astate) + { + assert(astate != STATE_NONEX); + m_state = astate; + } - const netlist_logic_family_desc_t *m_family_desc; + const netlist_logic_family_desc_t *m_family_desc; protected: - ATTR_COLD virtual void save_register() - { - save(NAME(m_state)); - netlist_owned_object_t::save_register(); - } + ATTR_COLD virtual void save_register() + { + save(NAME(m_state)); + netlist_owned_object_t::save_register(); + } private: - netlist_net_t * RESTRICT m_net; - state_e m_state; + netlist_net_t * RESTRICT m_net; + state_e m_state; }; NETLIST_SAVE_TYPE(netlist_core_terminal_t::state_e, DT_INT); @@ -420,41 +420,41 @@ NETLIST_SAVE_TYPE(netlist_core_terminal_t::state_e, DT_INT); class netlist_terminal_t : public netlist_core_terminal_t { - NETLIST_PREVENT_COPYING(netlist_terminal_t) + NETLIST_PREVENT_COPYING(netlist_terminal_t) public: - ATTR_COLD netlist_terminal_t(); + ATTR_COLD netlist_terminal_t(); - double m_Idr; // drive current - double m_go; // conductance for Voltage from other term - double m_gt; // conductance for total conductance + double m_Idr; // drive current + double m_go; // conductance for Voltage from other term + double m_gt; // conductance for total conductance - ATTR_HOT inline void set(const double G) - { - m_Idr = 0; - m_go = m_gt = G; - } + ATTR_HOT inline void set(const double G) + { + m_Idr = 0; + m_go = m_gt = G; + } - ATTR_HOT inline void set(const double GO, const double GT) - { - m_Idr = 0; - m_go = GO; - m_gt = GT; - } + ATTR_HOT inline void set(const double GO, const double GT) + { + m_Idr = 0; + m_go = GO; + m_gt = GT; + } - ATTR_HOT inline void set(const double GO, const double GT, const double I) - { - m_Idr = I; - m_go = GO; - m_gt = GT; - } + ATTR_HOT inline void set(const double GO, const double GT, const double I) + { + m_Idr = I; + m_go = GO; + m_gt = GT; + } - netlist_terminal_t *m_otherterm; + netlist_terminal_t *m_otherterm; protected: - ATTR_COLD virtual void save_register(); + ATTR_COLD virtual void save_register(); - ATTR_COLD virtual void reset(); + ATTR_COLD virtual void reset(); }; @@ -467,23 +467,23 @@ class netlist_input_t : public netlist_core_terminal_t public: - ATTR_COLD netlist_input_t(const type_t atype, const family_t afamily) - : netlist_core_terminal_t(atype, afamily) - { - set_state(STATE_INP_ACTIVE); - } + ATTR_COLD netlist_input_t(const type_t atype, const family_t afamily) + : netlist_core_terminal_t(atype, afamily) + { + set_state(STATE_INP_ACTIVE); + } - ATTR_HOT inline void inactivate(); - ATTR_HOT inline void activate(); - ATTR_HOT inline void activate_hl(); - ATTR_HOT inline void activate_lh(); + ATTR_HOT inline void inactivate(); + ATTR_HOT inline void activate(); + ATTR_HOT inline void activate_hl(); + ATTR_HOT inline void activate_lh(); protected: - ATTR_COLD virtual void reset() - { - //netlist_core_terminal_t::reset(); - set_state(STATE_INP_ACTIVE); - } + ATTR_COLD virtual void reset() + { + //netlist_core_terminal_t::reset(); + set_state(STATE_INP_ACTIVE); + } private: }; @@ -495,13 +495,13 @@ private: class netlist_logic_input_t : public netlist_input_t { public: - ATTR_COLD netlist_logic_input_t() - : netlist_input_t(INPUT, LOGIC) - { - } + ATTR_COLD netlist_logic_input_t() + : netlist_input_t(INPUT, LOGIC) + { + } - ATTR_HOT inline const netlist_sig_t Q() const; - ATTR_HOT inline const netlist_sig_t last_Q() const; + ATTR_HOT inline const netlist_sig_t Q() const; + ATTR_HOT inline const netlist_sig_t last_Q() const; }; @@ -512,8 +512,8 @@ public: class netlist_ttl_input_t : public netlist_logic_input_t { public: - ATTR_COLD netlist_ttl_input_t() - : netlist_logic_input_t() { } + ATTR_COLD netlist_ttl_input_t() + : netlist_logic_input_t() { } }; // ---------------------------------------------------------------------------------------- @@ -523,10 +523,10 @@ public: class netlist_analog_input_t : public netlist_input_t { public: - ATTR_COLD netlist_analog_input_t() - : netlist_input_t(INPUT, ANALOG) { } + ATTR_COLD netlist_analog_input_t() + : netlist_input_t(INPUT, ANALOG) { } - ATTR_HOT inline const double Q_Analog() const; + ATTR_HOT inline const double Q_Analog() const; }; //#define INPVAL(_x) (_x).Q() @@ -537,120 +537,120 @@ public: class netlist_net_t : public netlist_object_t { - NETLIST_PREVENT_COPYING(netlist_net_t) + NETLIST_PREVENT_COPYING(netlist_net_t) public: - typedef netlist_list_t<netlist_net_t *> list_t; + typedef netlist_list_t<netlist_net_t *> list_t; - friend class NETLIB_NAME(mainclock); - friend class netlist_matrix_solver_t; - friend class netlist_logic_output_t; - friend class netlist_analog_output_t; - friend class netlist_setup_t; + friend class NETLIB_NAME(mainclock); + friend class netlist_matrix_solver_t; + friend class netlist_logic_output_t; + friend class netlist_analog_output_t; + friend class netlist_setup_t; - ATTR_COLD netlist_net_t(const type_t atype, const family_t afamily); - ATTR_COLD virtual ~netlist_net_t(); + ATTR_COLD netlist_net_t(const type_t atype, const family_t afamily); + ATTR_COLD virtual ~netlist_net_t(); - ATTR_COLD void init_object(netlist_base_t &nl, const pstring &aname); + ATTR_COLD void init_object(netlist_base_t &nl, const pstring &aname); - ATTR_COLD void register_con(netlist_core_terminal_t &terminal); - ATTR_COLD void merge_net(netlist_net_t *othernet); - ATTR_COLD void register_railterminal(netlist_output_t &mr); + ATTR_COLD void register_con(netlist_core_terminal_t &terminal); + ATTR_COLD void merge_net(netlist_net_t *othernet); + ATTR_COLD void register_railterminal(netlist_output_t &mr); - ATTR_HOT inline void update_devs(); + ATTR_HOT inline void update_devs(); - ATTR_HOT inline const netlist_time time() const { return m_time; } - ATTR_HOT inline void set_time(const netlist_time ntime) { m_time = ntime; } + ATTR_HOT inline const netlist_time time() const { return m_time; } + ATTR_HOT inline void set_time(const netlist_time ntime) { m_time = ntime; } - ATTR_HOT inline bool isRailNet() const { return !(m_railterminal == NULL); } - ATTR_HOT inline const netlist_core_terminal_t & RESTRICT railterminal() const { return *m_railterminal; } + ATTR_HOT inline bool isRailNet() const { return !(m_railterminal == NULL); } + ATTR_HOT inline const netlist_core_terminal_t & RESTRICT railterminal() const { return *m_railterminal; } - /* Everything below is used by the logic subsystem */ - ATTR_HOT void inc_active(netlist_core_terminal_t &term); - ATTR_HOT void dec_active(netlist_core_terminal_t &term); + /* Everything below is used by the logic subsystem */ + ATTR_HOT void inc_active(netlist_core_terminal_t &term); + ATTR_HOT void dec_active(netlist_core_terminal_t &term); - ATTR_HOT inline const netlist_sig_t Q() const - { - assert(family() == LOGIC); - return m_cur_Q; - } + ATTR_HOT inline const netlist_sig_t Q() const + { + assert(family() == LOGIC); + return m_cur_Q; + } - ATTR_HOT inline const netlist_sig_t last_Q() const - { - assert(family() == LOGIC); - return m_last_Q; - } + ATTR_HOT inline const netlist_sig_t last_Q() const + { + assert(family() == LOGIC); + return m_last_Q; + } - ATTR_HOT inline const netlist_sig_t new_Q() const - { - assert(family() == LOGIC); - return m_new_Q; - } + ATTR_HOT inline const netlist_sig_t new_Q() const + { + assert(family() == LOGIC); + return m_new_Q; + } - ATTR_HOT inline const double Q_Analog() const - { - //assert(object_type(SIGNAL_MASK) == SIGNAL_ANALOG); - assert(family() == ANALOG); - return m_cur_Analog; - } + ATTR_HOT inline const double Q_Analog() const + { + //assert(object_type(SIGNAL_MASK) == SIGNAL_ANALOG); + assert(family() == ANALOG); + return m_cur_Analog; + } - ATTR_HOT inline void push_to_queue(const netlist_time delay); - ATTR_HOT bool inline is_queued() const { return m_in_queue == 1; } + ATTR_HOT inline void push_to_queue(const netlist_time delay); + ATTR_HOT bool inline is_queued() const { return m_in_queue == 1; } - /* internal state support - * FIXME: get rid of this and implement export/import in MAME - */ - ATTR_COLD inline netlist_sig_t &Q_state_ptr() - { - assert(family() == LOGIC); - return m_cur_Q; - } + /* internal state support + * FIXME: get rid of this and implement export/import in MAME + */ + ATTR_COLD inline netlist_sig_t &Q_state_ptr() + { + assert(family() == LOGIC); + return m_cur_Q; + } - ATTR_COLD inline double &Q_Analog_state_ptr() - { - //assert(object_type(SIGNAL_MASK) == SIGNAL_ANALOG); - assert(family() == ANALOG); - return m_cur_Analog; - } + ATTR_COLD inline double &Q_Analog_state_ptr() + { + //assert(object_type(SIGNAL_MASK) == SIGNAL_ANALOG); + assert(family() == ANALOG); + return m_cur_Analog; + } - ATTR_HOT inline int num_cons() const { return m_num_cons; } + ATTR_HOT inline int num_cons() const { return m_num_cons; } - // m_terms is only used by analog subsystem - typedef netlist_list_t<netlist_terminal_t *> terminal_list_t; + // m_terms is only used by analog subsystem + typedef netlist_list_t<netlist_terminal_t *> terminal_list_t; - terminal_list_t m_terms; - terminal_list_t m_rails; - netlist_matrix_solver_t *m_solver; - netlist_core_terminal_t * RESTRICT m_railterminal; + terminal_list_t m_terms; + terminal_list_t m_rails; + netlist_matrix_solver_t *m_solver; + netlist_core_terminal_t * RESTRICT m_railterminal; - ATTR_HOT void solve(); + ATTR_HOT void solve(); - netlist_list_t<netlist_core_terminal_t *> m_registered; // save post-start m_list ... - plinked_list<netlist_core_terminal_t> m_list; + netlist_list_t<netlist_core_terminal_t *> m_registered; // save post-start m_list ... + plinked_list<netlist_core_terminal_t> m_list; - ATTR_COLD void rebuild_list(); /* rebuild m_list after a load */ + ATTR_COLD void rebuild_list(); /* rebuild m_list after a load */ protected: //FIXME: needed by current solver code - UINT16 m_num_cons; + UINT16 m_num_cons; - ATTR_COLD virtual void save_register(); - ATTR_COLD virtual void reset(); + ATTR_COLD virtual void save_register(); + ATTR_COLD virtual void reset(); private: - netlist_sig_t m_new_Q; - netlist_sig_t m_cur_Q; - netlist_sig_t m_last_Q; + netlist_sig_t m_new_Q; + netlist_sig_t m_cur_Q; + netlist_sig_t m_last_Q; - netlist_time m_time; - INT32 m_active; - UINT8 m_in_queue; /* 0: not in queue, 1: in queue, 2: last was taken */ + netlist_time m_time; + INT32 m_active; + UINT8 m_in_queue; /* 0: not in queue, 1: in queue, 2: last was taken */ public: - double m_last_Analog; - double m_cur_Analog; - double m_new_Analog; + double m_last_Analog; + double m_cur_Analog; + double m_new_Analog; }; @@ -661,74 +661,74 @@ public: class netlist_output_t : public netlist_core_terminal_t { - NETLIST_PREVENT_COPYING(netlist_output_t) + NETLIST_PREVENT_COPYING(netlist_output_t) public: - ATTR_COLD netlist_output_t(const type_t atype, const family_t afamily); - ATTR_COLD virtual ~netlist_output_t() {} + ATTR_COLD netlist_output_t(const type_t atype, const family_t afamily); + ATTR_COLD virtual ~netlist_output_t() {} - ATTR_COLD void init_object(netlist_core_device_t &dev, const pstring &aname); - ATTR_COLD virtual void reset() - { - //netlist_core_terminal_t::reset(); - set_state(STATE_OUT); - } + ATTR_COLD void init_object(netlist_core_device_t &dev, const pstring &aname); + ATTR_COLD virtual void reset() + { + //netlist_core_terminal_t::reset(); + set_state(STATE_OUT); + } private: - netlist_net_t m_my_net; + netlist_net_t m_my_net; }; class netlist_logic_output_t : public netlist_output_t { - NETLIST_PREVENT_COPYING(netlist_logic_output_t) + NETLIST_PREVENT_COPYING(netlist_logic_output_t) public: - ATTR_COLD netlist_logic_output_t(); + ATTR_COLD netlist_logic_output_t(); - ATTR_COLD void initial(const netlist_sig_t val); + ATTR_COLD void initial(const netlist_sig_t val); - ATTR_COLD bool has_proxy() const { return (m_proxy != NULL); } - ATTR_COLD nld_base_d_to_a_proxy *get_proxy() const { return m_proxy; } - ATTR_COLD void set_proxy(nld_base_d_to_a_proxy *proxy) { m_proxy = proxy; } + ATTR_COLD bool has_proxy() const { return (m_proxy != NULL); } + ATTR_COLD nld_base_d_to_a_proxy *get_proxy() const { return m_proxy; } + ATTR_COLD void set_proxy(nld_base_d_to_a_proxy *proxy) { m_proxy = proxy; } - ATTR_HOT inline void set_Q(const netlist_sig_t newQ, const netlist_time delay) - { - if (EXPECTED(newQ != net().m_new_Q)) - { - net().m_new_Q = newQ; - net().push_to_queue(delay); - } - } + ATTR_HOT inline void set_Q(const netlist_sig_t newQ, const netlist_time delay) + { + if (EXPECTED(newQ != net().m_new_Q)) + { + net().m_new_Q = newQ; + net().push_to_queue(delay); + } + } private: - nld_base_d_to_a_proxy *m_proxy; + nld_base_d_to_a_proxy *m_proxy; }; class netlist_ttl_output_t : public netlist_logic_output_t { public: - ATTR_COLD netlist_ttl_output_t(); + ATTR_COLD netlist_ttl_output_t(); }; class netlist_analog_output_t : public netlist_output_t { - NETLIST_PREVENT_COPYING(netlist_analog_output_t) + NETLIST_PREVENT_COPYING(netlist_analog_output_t) public: - ATTR_COLD netlist_analog_output_t(); + ATTR_COLD netlist_analog_output_t(); - ATTR_COLD void initial(const double val); + ATTR_COLD void initial(const double val); - ATTR_HOT inline void set_Q(const double newQ, const netlist_time delay) - { - if (newQ != net().m_new_Analog) - { - net().m_new_Analog = newQ; - net().push_to_queue(delay); - } - } + ATTR_HOT inline void set_Q(const double newQ, const netlist_time delay) + { + if (newQ != net().m_new_Analog) + { + net().m_new_Analog = newQ; + net().push_to_queue(delay); + } + } }; @@ -738,110 +738,110 @@ public: class netlist_param_t : public netlist_owned_object_t { - NETLIST_PREVENT_COPYING(netlist_param_t) + NETLIST_PREVENT_COPYING(netlist_param_t) public: - enum param_type_t { - MODEL, - STRING, - DOUBLE, - INTEGER, - LOGIC - }; + enum param_type_t { + MODEL, + STRING, + DOUBLE, + INTEGER, + LOGIC + }; - ATTR_COLD netlist_param_t(const param_type_t atype); + ATTR_COLD netlist_param_t(const param_type_t atype); - ATTR_HOT inline const param_type_t param_type() const { return m_param_type; } + ATTR_HOT inline const param_type_t param_type() const { return m_param_type; } protected: - ATTR_COLD virtual void reset() { } + ATTR_COLD virtual void reset() { } private: - const param_type_t m_param_type; + const param_type_t m_param_type; }; class netlist_param_double_t : public netlist_param_t { - NETLIST_PREVENT_COPYING(netlist_param_double_t) + NETLIST_PREVENT_COPYING(netlist_param_double_t) public: - ATTR_COLD netlist_param_double_t(); + ATTR_COLD netlist_param_double_t(); - ATTR_HOT inline void setTo(const double param); - ATTR_COLD inline void initial(const double val) { m_param = val; } - ATTR_HOT inline const double Value() const { return m_param; } + ATTR_HOT inline void setTo(const double param); + ATTR_COLD inline void initial(const double val) { m_param = val; } + ATTR_HOT inline const double Value() const { return m_param; } protected: - ATTR_COLD virtual void save_register() - { - save(NAME(m_param)); - netlist_param_t::save_register(); - } + ATTR_COLD virtual void save_register() + { + save(NAME(m_param)); + netlist_param_t::save_register(); + } private: - double m_param; + double m_param; }; class netlist_param_int_t : public netlist_param_t { - NETLIST_PREVENT_COPYING(netlist_param_int_t) + NETLIST_PREVENT_COPYING(netlist_param_int_t) public: - ATTR_COLD netlist_param_int_t(); + ATTR_COLD netlist_param_int_t(); - ATTR_HOT inline void setTo(const int param); - ATTR_COLD inline void initial(const int val) { m_param = val; } + ATTR_HOT inline void setTo(const int param); + ATTR_COLD inline void initial(const int val) { m_param = val; } - ATTR_HOT inline const int Value() const { return m_param; } + ATTR_HOT inline const int Value() const { return m_param; } protected: - ATTR_COLD virtual void save_register() - { - save(NAME(m_param)); - netlist_param_t::save_register(); - } + ATTR_COLD virtual void save_register() + { + save(NAME(m_param)); + netlist_param_t::save_register(); + } private: - int m_param; + int m_param; }; class netlist_param_logic_t : public netlist_param_int_t { - NETLIST_PREVENT_COPYING(netlist_param_logic_t) + NETLIST_PREVENT_COPYING(netlist_param_logic_t) public: - ATTR_COLD netlist_param_logic_t(); + ATTR_COLD netlist_param_logic_t(); }; class netlist_param_str_t : public netlist_param_t { - NETLIST_PREVENT_COPYING(netlist_param_str_t) + NETLIST_PREVENT_COPYING(netlist_param_str_t) public: - ATTR_COLD netlist_param_str_t(); + ATTR_COLD netlist_param_str_t(); - ATTR_HOT inline void setTo(const pstring ¶m); - ATTR_COLD inline void initial(const pstring &val) { m_param = val; } + ATTR_HOT inline void setTo(const pstring ¶m); + ATTR_COLD inline void initial(const pstring &val) { m_param = val; } - ATTR_HOT inline const pstring &Value() const { return m_param; } + ATTR_HOT inline const pstring &Value() const { return m_param; } private: - pstring m_param; + pstring m_param; }; class netlist_param_model_t : public netlist_param_t { - NETLIST_PREVENT_COPYING(netlist_param_model_t) + NETLIST_PREVENT_COPYING(netlist_param_model_t) public: - ATTR_COLD netlist_param_model_t(); + ATTR_COLD netlist_param_model_t(); - ATTR_COLD inline void initial(const pstring &val) { m_param = val; } + ATTR_COLD inline void initial(const pstring &val) { m_param = val; } - ATTR_HOT inline const pstring &Value() const { return m_param; } + ATTR_HOT inline const pstring &Value() const { return m_param; } - /* these should be cached! */ - ATTR_COLD double model_value(const pstring &entity, const double defval = 0.0) const; - ATTR_COLD const pstring model_type() const; + /* these should be cached! */ + ATTR_COLD double model_value(const pstring &entity, const double defval = 0.0) const; + ATTR_COLD const pstring model_type() const; private: - pstring m_param; + pstring m_param; }; // ---------------------------------------------------------------------------------------- @@ -850,90 +850,90 @@ private: class netlist_core_device_t : public netlist_object_t { - NETLIST_PREVENT_COPYING(netlist_core_device_t) + NETLIST_PREVENT_COPYING(netlist_core_device_t) public: - typedef netlist_list_t<netlist_core_device_t *> list_t; + typedef netlist_list_t<netlist_core_device_t *> list_t; - //ATTR_COLD netlist_core_device_t(); - ATTR_COLD netlist_core_device_t(const family_t afamily); - ATTR_COLD netlist_core_device_t(const netlist_logic_family_desc_t *family_desc); + //ATTR_COLD netlist_core_device_t(); + ATTR_COLD netlist_core_device_t(const family_t afamily); + ATTR_COLD netlist_core_device_t(const netlist_logic_family_desc_t *family_desc); - ATTR_COLD virtual ~netlist_core_device_t(); + ATTR_COLD virtual ~netlist_core_device_t(); - ATTR_COLD virtual void init(netlist_base_t &anetlist, const pstring &name); - ATTR_HOT virtual void update_param() {} + ATTR_COLD virtual void init(netlist_base_t &anetlist, const pstring &name); + ATTR_HOT virtual void update_param() {} - ATTR_HOT inline void update_dev() - { + ATTR_HOT inline void update_dev() + { #if USE_PMFDELEGATES - static_update(this); + static_update(this); #else - update(); + update(); #endif - } - ATTR_HOT inline void start_dev() - { - start(); - } + } + ATTR_HOT inline void start_dev() + { + start(); + } - ATTR_HOT const netlist_sig_t INPLOGIC_PASSIVE(netlist_logic_input_t &inp); + ATTR_HOT const netlist_sig_t INPLOGIC_PASSIVE(netlist_logic_input_t &inp); - ATTR_HOT inline const netlist_sig_t INPLOGIC(const netlist_logic_input_t &inp) const - { - assert(inp.state() != netlist_input_t::STATE_INP_PASSIVE); - return inp.Q(); - } + ATTR_HOT inline const netlist_sig_t INPLOGIC(const netlist_logic_input_t &inp) const + { + assert(inp.state() != netlist_input_t::STATE_INP_PASSIVE); + return inp.Q(); + } - ATTR_HOT inline void OUTLOGIC(netlist_logic_output_t &out, const netlist_sig_t val, const netlist_time delay) - { - out.set_Q(val, delay); - } + ATTR_HOT inline void OUTLOGIC(netlist_logic_output_t &out, const netlist_sig_t val, const netlist_time delay) + { + out.set_Q(val, delay); + } - ATTR_HOT inline bool INP_HL(const netlist_logic_input_t &inp) const - { - return ((inp.last_Q() & !inp.Q()) == 1); - } + ATTR_HOT inline bool INP_HL(const netlist_logic_input_t &inp) const + { + return ((inp.last_Q() & !inp.Q()) == 1); + } - ATTR_HOT inline bool INP_LH(const netlist_logic_input_t &inp) const - { - return ((!inp.last_Q() & inp.Q()) == 1); - } + ATTR_HOT inline bool INP_LH(const netlist_logic_input_t &inp) const + { + return ((!inp.last_Q() & inp.Q()) == 1); + } - ATTR_HOT inline const double INPANALOG(const netlist_analog_input_t &inp) const { return inp.Q_Analog(); } + ATTR_HOT inline const double INPANALOG(const netlist_analog_input_t &inp) const { return inp.Q_Analog(); } - ATTR_HOT inline const double TERMANALOG(const netlist_terminal_t &term) const { return term.net().Q_Analog(); } + ATTR_HOT inline const double TERMANALOG(const netlist_terminal_t &term) const { return term.net().Q_Analog(); } - ATTR_HOT inline void OUTANALOG(netlist_analog_output_t &out, const double val, const netlist_time delay) - { - out.set_Q(val, delay); - } + ATTR_HOT inline void OUTANALOG(netlist_analog_output_t &out, const double val, const netlist_time delay) + { + out.set_Q(val, delay); + } - ATTR_HOT virtual void inc_active() { } + ATTR_HOT virtual void inc_active() { } - ATTR_HOT virtual void dec_active() { } + ATTR_HOT virtual void dec_active() { } - ATTR_HOT virtual void step_time(const double st) { } - ATTR_HOT virtual void update_terminals() { } + ATTR_HOT virtual void step_time(const double st) { } + ATTR_HOT virtual void update_terminals() { } #if (NL_KEEP_STATISTICS) - /* stats */ - osd_ticks_t total_time; - INT32 stat_count; + /* stats */ + osd_ticks_t total_time; + INT32 stat_count; #endif #if USE_PMFDELEGATES - net_update_delegate static_update; + net_update_delegate static_update; #endif - const netlist_logic_family_desc_t *m_family_desc; + const netlist_logic_family_desc_t *m_family_desc; protected: - ATTR_HOT virtual void update() { } - ATTR_COLD virtual void start() { } + ATTR_HOT virtual void update() { } + ATTR_COLD virtual void start() { } private: }; @@ -941,36 +941,36 @@ private: class netlist_device_t : public netlist_core_device_t { - NETLIST_PREVENT_COPYING(netlist_device_t) + NETLIST_PREVENT_COPYING(netlist_device_t) public: - ATTR_COLD netlist_device_t(); - ATTR_COLD netlist_device_t(const family_t afamily); + ATTR_COLD netlist_device_t(); + ATTR_COLD netlist_device_t(const family_t afamily); - ATTR_COLD virtual ~netlist_device_t(); + ATTR_COLD virtual ~netlist_device_t(); - ATTR_COLD virtual void init(netlist_base_t &anetlist, const pstring &name); + ATTR_COLD virtual void init(netlist_base_t &anetlist, const pstring &name); - ATTR_COLD netlist_setup_t &setup(); + ATTR_COLD netlist_setup_t &setup(); - ATTR_COLD void register_sub(netlist_device_t &dev, const pstring &name); - ATTR_COLD void register_subalias(const pstring &name, netlist_core_terminal_t &term); - ATTR_COLD void register_terminal(const pstring &name, netlist_terminal_t &port); - ATTR_COLD void register_output(const pstring &name, netlist_output_t &out); - ATTR_COLD void register_input(const pstring &name, netlist_input_t &in); + ATTR_COLD void register_sub(netlist_device_t &dev, const pstring &name); + ATTR_COLD void register_subalias(const pstring &name, netlist_core_terminal_t &term); + ATTR_COLD void register_terminal(const pstring &name, netlist_terminal_t &port); + ATTR_COLD void register_output(const pstring &name, netlist_output_t &out); + ATTR_COLD void register_input(const pstring &name, netlist_input_t &in); - ATTR_COLD void connect(netlist_core_terminal_t &t1, netlist_core_terminal_t &t2); + ATTR_COLD void connect(netlist_core_terminal_t &t1, netlist_core_terminal_t &t2); - netlist_list_t<pstring, 20> m_terminals; + netlist_list_t<pstring, 20> m_terminals; protected: - ATTR_HOT virtual void update() { } - ATTR_HOT virtual void start() { } - ATTR_HOT virtual void update_terminals() { } + ATTR_HOT virtual void update() { } + ATTR_HOT virtual void start() { } + ATTR_HOT virtual void update_terminals() { } - template <class C, class T> - ATTR_COLD void register_param(const pstring &sname, C ¶m, const T initialVal); + template <class C, class T> + ATTR_COLD void register_param(const pstring &sname, C ¶m, const T initialVal); private: }; @@ -981,23 +981,23 @@ private: // ---------------------------------------------------------------------------------------- class netlist_queue_t : public netlist_timed_queue<netlist_net_t *, netlist_time, 512>, - public pstate_callback_t + public pstate_callback_t { public: - netlist_queue_t(netlist_base_t &nl); + netlist_queue_t(netlist_base_t &nl); - void register_state(pstate_manager_t &manager, const pstring &module); - void on_pre_save(); - void on_post_load(); + void register_state(pstate_manager_t &manager, const pstring &module); + void on_pre_save(); + void on_post_load(); - pstate_callback_t &callback() { return *this; } + pstate_callback_t &callback() { return *this; } private: - netlist_base_t &m_netlist; - int m_qsize; - netlist_time::INTERNALTYPE m_times[512]; - char m_name[512][64]; + netlist_base_t &m_netlist; + int m_qsize; + netlist_time::INTERNALTYPE m_times[512]; + char m_name[512][64]; }; // ---------------------------------------------------------------------------------------- @@ -1009,121 +1009,121 @@ typedef tagmap_t<netlist_device_t *, 393> tagmap_devices_t; class netlist_base_t : public netlist_object_t, public pstate_manager_t { - NETLIST_PREVENT_COPYING(netlist_base_t) + NETLIST_PREVENT_COPYING(netlist_base_t) public: - netlist_base_t(); - virtual ~netlist_base_t(); - - ATTR_COLD void start(); - - ATTR_HOT inline const netlist_queue_t &queue() const { return m_queue; } - ATTR_HOT inline netlist_queue_t &queue() { return m_queue; } - ATTR_HOT inline const netlist_time time() const { return m_time; } - ATTR_HOT inline NETLIB_NAME(solver) *solver() const { return m_solver; } - ATTR_HOT inline NETLIB_NAME(gnd) *gnd() const { return m_gnd; } - ATTR_HOT const double gmin() const; - - ATTR_HOT inline void push_to_queue(netlist_net_t *out, const netlist_time attime) - { - m_queue.push(netlist_queue_t::entry_t(attime, out)); - } - - ATTR_HOT void process_queue(const netlist_time delta); - ATTR_HOT inline void abort_current_queue_slice() { m_stop = netlist_time::zero; } - - ATTR_COLD void rebuild_lists(); /* must be called after post_load ! */ - - ATTR_COLD void set_setup(netlist_setup_t *asetup) { m_setup = asetup; } - ATTR_COLD netlist_setup_t &setup() { return *m_setup; } - - ATTR_COLD netlist_net_t *find_net(const pstring &name); - - ATTR_COLD void error(const char *format, ...) const ATTR_PRINTF(2,3); - ATTR_COLD void warning(const char *format, ...) const ATTR_PRINTF(2,3); - ATTR_COLD void log(const char *format, ...) const ATTR_PRINTF(2,3); - - template<class _C> - netlist_list_t<_C *> get_device_list() - { - netlist_list_t<_C *> tmp; - for (tagmap_devices_t::entry_t *entry = m_devices.first(); entry != NULL; entry = m_devices.next(entry)) - { - _C *dev = dynamic_cast<_C *>(entry->object()); - if (dev != NULL) - tmp.add(dev); - } - return tmp; - } - - template<class _C> - _C *get_first_device() - { - for (tagmap_devices_t::entry_t *entry = m_devices.first(); entry != NULL; entry = m_devices.next(entry)) - { - _C *dev = dynamic_cast<_C *>(entry->object()); - if (dev != NULL) - return dev; - } - return NULL; - } - - template<class _C> - _C *get_single_device(const char *classname) - { - _C *ret = NULL; - for (tagmap_devices_t::entry_t *entry = m_devices.first(); entry != NULL; entry = m_devices.next(entry)) - { - _C *dev = dynamic_cast<_C *>(entry->object()); - if (dev != NULL) - { - if (ret != NULL) - this->error("more than one %s device found", classname); - else - ret = dev; - } - } - return ret; - } - - tagmap_devices_t m_devices; - netlist_net_t::list_t m_nets; + netlist_base_t(); + virtual ~netlist_base_t(); + + ATTR_COLD void start(); + + ATTR_HOT inline const netlist_queue_t &queue() const { return m_queue; } + ATTR_HOT inline netlist_queue_t &queue() { return m_queue; } + ATTR_HOT inline const netlist_time time() const { return m_time; } + ATTR_HOT inline NETLIB_NAME(solver) *solver() const { return m_solver; } + ATTR_HOT inline NETLIB_NAME(gnd) *gnd() const { return m_gnd; } + ATTR_HOT const double gmin() const; + + ATTR_HOT inline void push_to_queue(netlist_net_t *out, const netlist_time attime) + { + m_queue.push(netlist_queue_t::entry_t(attime, out)); + } + + ATTR_HOT void process_queue(const netlist_time delta); + ATTR_HOT inline void abort_current_queue_slice() { m_stop = netlist_time::zero; } + + ATTR_COLD void rebuild_lists(); /* must be called after post_load ! */ + + ATTR_COLD void set_setup(netlist_setup_t *asetup) { m_setup = asetup; } + ATTR_COLD netlist_setup_t &setup() { return *m_setup; } + + ATTR_COLD netlist_net_t *find_net(const pstring &name); + + ATTR_COLD void error(const char *format, ...) const ATTR_PRINTF(2,3); + ATTR_COLD void warning(const char *format, ...) const ATTR_PRINTF(2,3); + ATTR_COLD void log(const char *format, ...) const ATTR_PRINTF(2,3); + + template<class _C> + netlist_list_t<_C *> get_device_list() + { + netlist_list_t<_C *> tmp; + for (tagmap_devices_t::entry_t *entry = m_devices.first(); entry != NULL; entry = m_devices.next(entry)) + { + _C *dev = dynamic_cast<_C *>(entry->object()); + if (dev != NULL) + tmp.add(dev); + } + return tmp; + } + + template<class _C> + _C *get_first_device() + { + for (tagmap_devices_t::entry_t *entry = m_devices.first(); entry != NULL; entry = m_devices.next(entry)) + { + _C *dev = dynamic_cast<_C *>(entry->object()); + if (dev != NULL) + return dev; + } + return NULL; + } + + template<class _C> + _C *get_single_device(const char *classname) + { + _C *ret = NULL; + for (tagmap_devices_t::entry_t *entry = m_devices.first(); entry != NULL; entry = m_devices.next(entry)) + { + _C *dev = dynamic_cast<_C *>(entry->object()); + if (dev != NULL) + { + if (ret != NULL) + this->error("more than one %s device found", classname); + else + ret = dev; + } + } + return ret; + } + + tagmap_devices_t m_devices; + netlist_net_t::list_t m_nets; protected: - enum loglevel_e - { - NL_ERROR, - NL_WARNING, - NL_LOG, - }; + enum loglevel_e + { + NL_ERROR, + NL_WARNING, + NL_LOG, + }; - // any derived netlist must override this ... - ATTR_COLD virtual void verror(const loglevel_e level, - const char *format, va_list ap) const = 0; + // any derived netlist must override this ... + ATTR_COLD virtual void verror(const loglevel_e level, + const char *format, va_list ap) const = 0; - /* from netlist_object */ - ATTR_COLD virtual void reset(); - ATTR_COLD virtual void save_register(); + /* from netlist_object */ + ATTR_COLD virtual void reset(); + ATTR_COLD virtual void save_register(); #if (NL_KEEP_STATISTICS) - // performance - int m_perf_out_processed; - int m_perf_inp_processed; - int m_perf_inp_active; + // performance + int m_perf_out_processed; + int m_perf_inp_processed; + int m_perf_inp_active; #endif private: - netlist_time m_stop; // target time for current queue processing + netlist_time m_stop; // target time for current queue processing - netlist_time m_time; - netlist_queue_t m_queue; + netlist_time m_time; + netlist_queue_t m_queue; - NETLIB_NAME(mainclock) * m_mainclock; - NETLIB_NAME(solver) * m_solver; - NETLIB_NAME(gnd) * m_gnd; + NETLIB_NAME(mainclock) * m_mainclock; + NETLIB_NAME(solver) * m_solver; + NETLIB_NAME(gnd) * m_gnd; - netlist_setup_t *m_setup; + netlist_setup_t *m_setup; }; // ---------------------------------------------------------------------------------------- @@ -1134,94 +1134,94 @@ PSTATE_INTERFACE(netlist_object_t, m_netlist, name()) ATTR_HOT inline void netlist_param_str_t::setTo(const pstring ¶m) { - m_param = param; - netdev().update_param(); + m_param = param; + netdev().update_param(); } ATTR_HOT inline void netlist_param_int_t::setTo(const int param) { - if (m_param != param) - { - m_param = param; - netdev().update_param(); - } + if (m_param != param) + { + m_param = param; + netdev().update_param(); + } } ATTR_HOT inline void netlist_param_double_t::setTo(const double param) { - if (m_param != param) - { - m_param = param; - netdev().update_param(); - } + if (m_param != param) + { + m_param = param; + netdev().update_param(); + } } ATTR_HOT inline void netlist_input_t::inactivate() { - if (EXPECTED(!is_state(STATE_INP_PASSIVE))) - { - set_state(STATE_INP_PASSIVE); - net().dec_active(*this); - } + if (EXPECTED(!is_state(STATE_INP_PASSIVE))) + { + set_state(STATE_INP_PASSIVE); + net().dec_active(*this); + } } ATTR_HOT inline void netlist_input_t::activate() { - if (is_state(STATE_INP_PASSIVE)) - { - net().inc_active(*this); - set_state(STATE_INP_ACTIVE); - } + if (is_state(STATE_INP_PASSIVE)) + { + net().inc_active(*this); + set_state(STATE_INP_ACTIVE); + } } ATTR_HOT inline void netlist_input_t::activate_hl() { - if (is_state(STATE_INP_PASSIVE)) - { - net().inc_active(*this); - set_state(STATE_INP_HL); - } + if (is_state(STATE_INP_PASSIVE)) + { + net().inc_active(*this); + set_state(STATE_INP_HL); + } } ATTR_HOT inline void netlist_input_t::activate_lh() { - if (is_state(STATE_INP_PASSIVE)) - { - net().inc_active(*this); - set_state(STATE_INP_LH); - } + if (is_state(STATE_INP_PASSIVE)) + { + net().inc_active(*this); + set_state(STATE_INP_LH); + } } ATTR_HOT inline void netlist_net_t::push_to_queue(const netlist_time delay) { - //if (UNEXPECTED(m_num_cons == 0 || is_queued())) - if (!is_queued()) - { - m_time = netlist().time() + delay; - m_in_queue = (m_active > 0); /* queued ? */ - if (EXPECTED(m_in_queue)) - { - netlist().push_to_queue(this, m_time); - } - } + //if (UNEXPECTED(m_num_cons == 0 || is_queued())) + if (!is_queued()) + { + m_time = netlist().time() + delay; + m_in_queue = (m_active > 0); /* queued ? */ + if (EXPECTED(m_in_queue)) + { + netlist().push_to_queue(this, m_time); + } + } } ATTR_HOT inline const netlist_sig_t netlist_logic_input_t::Q() const { - return net().Q(); + return net().Q(); } ATTR_HOT inline const netlist_sig_t netlist_logic_input_t::last_Q() const { - return net().last_Q(); + return net().last_Q(); } ATTR_HOT inline const double netlist_analog_input_t::Q_Analog() const { - return net().Q_Analog(); + return net().Q_Analog(); } @@ -1231,71 +1231,71 @@ ATTR_HOT inline const double netlist_analog_input_t::Q_Analog() const class net_device_t_base_factory { - NETLIST_PREVENT_COPYING(net_device_t_base_factory) + NETLIST_PREVENT_COPYING(net_device_t_base_factory) public: - ATTR_COLD net_device_t_base_factory(const pstring &name, const pstring &classname, - const pstring &def_param) - : m_name(name), m_classname(classname), m_def_param(def_param) - {} + ATTR_COLD net_device_t_base_factory(const pstring &name, const pstring &classname, + const pstring &def_param) + : m_name(name), m_classname(classname), m_def_param(def_param) + {} - ATTR_COLD virtual ~net_device_t_base_factory() {} + ATTR_COLD virtual ~net_device_t_base_factory() {} - ATTR_COLD virtual netlist_device_t *Create() const = 0; + ATTR_COLD virtual netlist_device_t *Create() const = 0; - ATTR_COLD const pstring &name() const { return m_name; } - ATTR_COLD const pstring &classname() const { return m_classname; } - ATTR_COLD const pstring ¶m_desc() const { return m_def_param; } - ATTR_COLD const nl_util::pstring_list term_param_list(); - ATTR_COLD const nl_util::pstring_list def_params(); + ATTR_COLD const pstring &name() const { return m_name; } + ATTR_COLD const pstring &classname() const { return m_classname; } + ATTR_COLD const pstring ¶m_desc() const { return m_def_param; } + ATTR_COLD const nl_util::pstring_list term_param_list(); + ATTR_COLD const nl_util::pstring_list def_params(); protected: - pstring m_name; /* device name */ - pstring m_classname; /* device class name */ - pstring m_def_param; /* default parameter */ + pstring m_name; /* device name */ + pstring m_classname; /* device class name */ + pstring m_def_param; /* default parameter */ }; template <class C> class net_device_t_factory : public net_device_t_base_factory { - NETLIST_PREVENT_COPYING(net_device_t_factory) + NETLIST_PREVENT_COPYING(net_device_t_factory) public: - ATTR_COLD net_device_t_factory(const pstring &name, const pstring &classname, - const pstring &def_param) - : net_device_t_base_factory(name, classname, def_param) { } - - ATTR_COLD netlist_device_t *Create() const - { - netlist_device_t *r = new C(); - //r->init(setup, name); - return r; - } + ATTR_COLD net_device_t_factory(const pstring &name, const pstring &classname, + const pstring &def_param) + : net_device_t_base_factory(name, classname, def_param) { } + + ATTR_COLD netlist_device_t *Create() const + { + netlist_device_t *r = new C(); + //r->init(setup, name); + return r; + } }; class netlist_factory_t { public: - typedef netlist_list_t<net_device_t_base_factory *> list_t; + typedef netlist_list_t<net_device_t_base_factory *> list_t; - ATTR_COLD netlist_factory_t(); - ATTR_COLD ~netlist_factory_t(); + ATTR_COLD netlist_factory_t(); + ATTR_COLD ~netlist_factory_t(); - ATTR_COLD void initialize(); + ATTR_COLD void initialize(); - template<class _C> - ATTR_COLD void register_device(const pstring &name, const pstring &classname, - const pstring &def_param) - { - m_list.add(new net_device_t_factory< _C >(name, classname, def_param) ); - } + template<class _C> + ATTR_COLD void register_device(const pstring &name, const pstring &classname, + const pstring &def_param) + { + m_list.add(new net_device_t_factory< _C >(name, classname, def_param) ); + } - ATTR_COLD netlist_device_t *new_device_by_classname(const pstring &classname, netlist_setup_t &setup) const; - ATTR_COLD netlist_device_t *new_device_by_name(const pstring &name, netlist_setup_t &setup) const; - ATTR_COLD net_device_t_base_factory * factory_by_name(const pstring &name, netlist_setup_t &setup) const; + ATTR_COLD netlist_device_t *new_device_by_classname(const pstring &classname, netlist_setup_t &setup) const; + ATTR_COLD netlist_device_t *new_device_by_name(const pstring &name, netlist_setup_t &setup) const; + ATTR_COLD net_device_t_base_factory * factory_by_name(const pstring &name, netlist_setup_t &setup) const; - const list_t &list() { return m_list; } + const list_t &list() { return m_list; } private: - list_t m_list; + list_t m_list; }; |