summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/devices/nlid_truthtable.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/devices/nlid_truthtable.cpp')
-rw-r--r--src/lib/netlist/devices/nlid_truthtable.cpp36
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,