diff options
Diffstat (limited to 'src/lib/netlist/devices/nlid_truthtable.cpp')
-rw-r--r-- | src/lib/netlist/devices/nlid_truthtable.cpp | 36 |
1 files changed, 19 insertions, 17 deletions
diff --git a/src/lib/netlist/devices/nlid_truthtable.cpp b/src/lib/netlist/devices/nlid_truthtable.cpp index cd8e9e1ed1b..2d3b1fcd2e2 100644 --- a/src/lib/netlist/devices/nlid_truthtable.cpp +++ b/src/lib/netlist/devices/nlid_truthtable.cpp @@ -141,12 +141,15 @@ namespace netlist struct truthtable_parser { - truthtable_parser(unsigned NO, unsigned NI, bool *initialized, + truthtable_parser(unsigned NO, unsigned NI, packed_int outs, uint_least8_t *timing, netlist_time *timing_nt) - : m_NO(NO), m_NI(NI), m_initialized(initialized), - m_out_state(outs), m_timing(timing), m_timing_nt(timing_nt), - m_num_bits(m_NI), - m_size(1 << (m_num_bits)) + : m_NO(NO) + , m_NI(NI) + , m_out_state(outs) + , m_timing(timing) + , m_timing_nt(timing_nt) + , m_num_bits(m_NI) + , m_size(1 << (m_num_bits)) { } @@ -160,7 +163,6 @@ namespace netlist unsigned m_NO; unsigned m_NI; - bool *m_initialized; packed_int m_out_state; uint_least8_t *m_timing; netlist_time *m_timing_nt; @@ -226,11 +228,16 @@ namespace netlist unique_pool_ptr<device_t> Create(netlist_state_t &anetlist, const pstring &name) override { using tt_type = nld_truthtable_t<m_NI, m_NO>; - truthtable_parser desc_s(m_NO, m_NI, &m_ttbl.m_initialized, - packed_int(m_ttbl.m_out_state.data(), sizeof(m_ttbl.m_out_state[0]) * 8), - m_ttbl.m_timing_index.data(), m_ttbl.m_timing_nt.data()); - desc_s.parse(m_desc); + if (!m_ttbl) + { + m_ttbl = pool().make_unique<typename nld_truthtable_t<m_NI, m_NO>::truthtable_t>(); + truthtable_parser desc_s(m_NO, m_NI, + packed_int(m_ttbl->m_out_state.data(), sizeof(m_ttbl->m_out_state[0]) * 8), + m_ttbl->m_timing_index.data(), m_ttbl->m_timing_nt.data()); + + desc_s.parse(m_desc); + } /* update truthtable family definitions */ if (m_family_name != "") @@ -239,10 +246,10 @@ namespace netlist if (m_family_desc == nullptr) throw nl_exception("family description not found for {1}", m_family_name); - return pool().make_unique<tt_type>(anetlist, name, m_family_desc, m_ttbl, m_desc); + return pool().make_unique<tt_type>(anetlist, name, m_family_desc, *m_ttbl, m_desc); } private: - typename nld_truthtable_t<m_NI, m_NO>::truthtable_t m_ttbl; + unique_pool_ptr<typename nld_truthtable_t<m_NI, m_NO>::truthtable_t> m_ttbl; }; tt_bitset truthtable_parser::calculate_ignored_inputs(tt_bitset state) @@ -359,9 +366,6 @@ void truthtable_parser::parse(const std::vector<pstring> &truthtable) { unsigned line = 0; - if (*m_initialized) - return; - pstring ttline(truthtable[line]); line++; ttline = truthtable[line]; @@ -448,8 +452,6 @@ void truthtable_parser::parse(const std::vector<pstring> &truthtable) throw nl_exception(plib::pfmt("truthtable: found element not set {1}\n").x(i) ); m_out_state.set(i, m_out_state[i] | (ign[i] << m_NO)); } - *m_initialized = true; - } netlist_base_factory_truthtable_t::netlist_base_factory_truthtable_t(const pstring &name, const pstring &classname, |