// license:GPL-2.0+ // copyright-holders:Couriersud /* * nld_truthtable.c * */ #include "nld_truthtable.h" #include "plib/plists.h" NETLIB_NAMESPACE_DEVICES_START() unsigned truthtable_desc_t::count_bits(UINT32 v) { unsigned ret = 0; for (; v != 0; v = v >> 1) { if (v & 1) ret++; } return ret; } UINT32 truthtable_desc_t::set_bits(UINT32 v, UINT32 b) { UINT32 ret = 0; int i = 0; for (; v != 0; v = v >> 1) { if (v & 1) { ret |= ((b&1)<> 1; } i++; } return ret; } UINT32 truthtable_desc_t::get_ignored_simple(UINT32 i) { UINT32 m_enable = 0; for (UINT32 j=0; j t(bits); for (UINT32 j=1; jjb)) { jb = nb; jm = j; } } return set_bits(nign, jm); } // ---------------------------------------------------------------------------------------- // desc // ---------------------------------------------------------------------------------------- void truthtable_desc_t::help(unsigned cur, pstring_vector_t list, UINT64 state,UINT16 val, parray_t &timing_index) { pstring elem = list[cur].trim(); int start = 0; int end = 0; if (elem.equals("0")) { start = 0; end = 0; } else if (elem.equals("1")) { start = 1; end = 1; } else if (elem.equals("X")) { start = 0; end = 1; } else nl_assert_always(false, "unknown input value (not 0, 1, or X)"); for (int i = start; i <= end; i++) { const UINT64 nstate = state | (i << cur); if (cur < m_num_bits - 1) { help(cur + 1, list, nstate, val, timing_index); } else { // cutoff previous inputs and outputs for ignore if (m_outs[nstate] != ~0U && m_outs[nstate] != val) fatalerror_e(pfmt("Error in truthtable: State {1} already set, {2} != {3}\n") .x(nstate,"04")(m_outs[nstate])(val) ); m_outs[nstate] = val; for (unsigned j=0; j tindex(m_NO); for (unsigned j=0; j ign(m_size); for (UINT32 j=0; j < m_size; j++) ign[j] = ~0U; for (UINT32 i=0; i xtype; \ return palloc(xtype(name,classname,def_param)); } break #define ENTRYY(_n,_m) ENTRYX(_n,_m,0); ENTRYX(_n,_m,1) #define ENTRY(_n) ENTRYY(_n, 1); ENTRYY(_n, 2); ENTRYY(_n, 3); ENTRYY(_n, 4); ENTRYY(_n, 5); ENTRYY(_n, 6) netlist_base_factory_truthtable_t *nl_tt_factory_create(const unsigned ni, const unsigned no, const unsigned has_state, const pstring &name, const pstring &classname, const pstring &def_param) { switch (ni * 1000 + no * 10 + has_state) { ENTRY(1); ENTRY(2); ENTRY(3); ENTRY(4); ENTRY(5); ENTRY(6); ENTRY(7); ENTRY(8); ENTRY(9); ENTRY(10); default: pstring msg = pfmt("unable to create truthtable<{1},{2},{3}>")(ni)(no)(has_state); nl_assert_always(false, msg); } return NULL; } NETLIB_NAMESPACE_DEVICES_END()