Netlist updates:

- Removed trampolines (OUTLOGIC, INPLOGIC and friends). 
- Started using doxygen comment and documentation style. Added doxygen
files to documentation folder. 
- Refactored code triggered by doxygen output. 
- Moved internal and support classes into namespace detail. 
- Use an anordered map in parser. 
- -Wconversion fixes - All done now. 
- Fixed -Wold-style-cast warnings in netlist code. 
- Added iterators to pstring. 
- Moved two macros, added more RAII and improved exceptions. Fixed some
bugs in parser code. 
- Fixed a number of bugs in parser code and exception handling. 
[Couriersud]
This commit is contained in:
couriersud 2016-07-21 11:05:55 +02:00
parent 7a69d48edd
commit 1e40d95e8b
90 changed files with 4930 additions and 1537 deletions

View File

@ -503,7 +503,7 @@ void netlist_mame_cpu_device_t::device_start()
for (int i=0; i < netlist().m_nets.size(); i++)
{
netlist::net_t *n = netlist().m_nets[i].get();
netlist::detail::net_t *n = netlist().m_nets[i].get();
if (n->is_logic())
{
state_add(i*2, n->name().cstr(), downcast<netlist::logic_net_t *>(n)->Q_state_ptr());
@ -604,7 +604,7 @@ void netlist_mame_sound_device_t::device_start()
for (int i=0; i < MAX_OUT; i++) m_out[i] = nullptr;
for (int i=0; i < m_num_outputs; i++)
{
int chan = outdevs[i]->m_channel.Value();
int chan = outdevs[i]->m_channel();
netlist().log().verbose("Output %d on channel %d", i, chan);

View File

@ -429,7 +429,7 @@ public:
inline void write(const UINT32 val)
{
const UINT32 v = (val >> m_shift) & m_mask;
if (v != m_param->Value())
if (v != (*m_param)())
synchronize(0, v);
}
@ -475,7 +475,7 @@ public:
inline void write(const UINT32 val)
{
const UINT32 v = (val >> m_shift) & 1;
if (v != m_param->Value())
if (v != (*m_param)())
synchronize(0, v);
}
@ -577,7 +577,7 @@ public:
NETLIB_UPDATEI()
{
nl_double cur = INPANALOG(m_in);
nl_double cur = m_in();
// FIXME: make this a parameter
// avoid calls due to noise
@ -637,7 +637,7 @@ public:
NETLIB_UPDATEI()
{
nl_double val = INPANALOG(m_in) * m_mult.Value() + m_offset.Value();
nl_double val = m_in() * m_mult() + m_offset();
sound_update(netlist().time());
/* ignore spikes */
if (std::abs(val) < 32767.0)
@ -709,12 +709,12 @@ public:
m_pos = 0;
for (int i = 0; i < MAX_INPUT_CHANNELS; i++)
{
if (m_param_name[i]->Value() != "")
if ((*m_param_name[i])() != pstring(""))
{
if (i != m_num_channel)
netlist().log().fatal("sound input numbering has to be sequential!");
m_num_channel++;
m_param[i] = dynamic_cast<netlist::param_double_t *>(setup().find_param(m_param_name[i]->Value(), true));
m_param[i] = dynamic_cast<netlist::param_double_t *>(setup().find_param((*m_param_name[i])(), true));
}
}
return m_num_channel;
@ -727,10 +727,10 @@ public:
if (m_buffer[i] == nullptr)
break; // stop, called outside of stream_update
const nl_double v = m_buffer[i][m_pos];
m_param[i]->setTo(v * m_param_mult[i]->Value() + m_param_offset[i]->Value());
m_param[i]->setTo(v * (*m_param_mult[i])() + (*m_param_offset[i])());
}
m_pos++;
OUTLOGIC(m_Q, !m_Q.net().new_Q(), m_inc );
m_Q.push(!m_Q.net().new_Q(), m_inc );
}
public:

View File

@ -113,7 +113,7 @@ NETLIB_UPDATE_TERMINALS(QBJT_switch)
{
const nl_double m = (is_qtype( BJT_NPN) ? 1 : -1);
const int new_state = (m_RB.deltaV() * m > m_V ) ? 1 : 0;
const unsigned new_state = (m_RB.deltaV() * m > m_V ) ? 1 : 0;
if (m_state_on ^ new_state)
{
const nl_double gb = new_state ? m_gB : netlist().gmin();

View File

@ -19,8 +19,8 @@ namespace netlist
NETLIB_RESET(VCCS)
{
const nl_double m_mult = m_G.Value() * m_gfac; // 1.0 ==> 1V ==> 1A
const nl_double GI = NL_FCONST(1.0) / m_RI.Value();
const nl_double m_mult = m_G() * m_gfac; // 1.0 ==> 1V ==> 1A
const nl_double GI = NL_FCONST(1.0) / m_RI();
m_IP.set(GI);
m_IN.set(GI);
@ -66,19 +66,19 @@ NETLIB_UPDATE(LVCCS)
NETLIB_UPDATE_TERMINALS(LVCCS)
{
const nl_double m_mult = m_G.Value() * m_gfac; // 1.0 ==> 1V ==> 1A
const nl_double m_mult = m_G() * m_gfac; // 1.0 ==> 1V ==> 1A
const nl_double vi = m_IP.net().Q_Analog() - m_IN.net().Q_Analog();
if (std::abs(m_mult / m_cur_limit * vi) > 0.5)
if (std::abs(m_mult / m_cur_limit() * vi) > 0.5)
m_vi = m_vi + 0.2*std::tanh((vi - m_vi)/0.2);
else
m_vi = vi;
const nl_double x = m_mult / m_cur_limit * m_vi;
const nl_double x = m_mult / m_cur_limit() * m_vi;
const nl_double X = std::tanh(x);
const nl_double beta = m_mult * (1.0 - X*X);
const nl_double I = m_cur_limit * X - beta * m_vi;
const nl_double I = m_cur_limit() * X - beta * m_vi;
m_OP.set(beta, NL_FCONST(0.0), I);
m_OP1.set(-beta, NL_FCONST(0.0));
@ -112,11 +112,11 @@ NETLIB_UPDATE(CCCS)
NETLIB_RESET(VCVS)
{
m_gfac = NL_FCONST(1.0) / m_RO.Value();
m_gfac = NL_FCONST(1.0) / m_RO();
NETLIB_NAME(VCCS)::reset();
m_OP2.set(NL_FCONST(1.0) / m_RO.Value());
m_ON2.set(NL_FCONST(1.0) / m_RO.Value());
m_OP2.set(NL_FCONST(1.0) / m_RO());
m_ON2.set(NL_FCONST(1.0) / m_RO());
}
} //namespace devices

View File

@ -157,7 +157,7 @@ public:
NETLIB_CONSTRUCTOR_DERIVED(CCCS, VCCS)
, m_gfac(1.0)
{
m_gfac = NL_FCONST(1.0) / m_RI.Value();
m_gfac = NL_FCONST(1.0) / m_RI();
}
protected:

View File

@ -60,9 +60,9 @@ NETLIB_UPDATE(OPAMP)
const double cVt = 0.0258 * 1.0; // * m_n;
const double cId = m_model.model_value("DAB"); // 3 mA
const double cVd = cVt * std::log(cId / 1e-15 + 1.0);
m_VH.set_Q(INPANALOG(m_VCC) - m_model.model_value("VLH") - cVd);
m_VL.set_Q(INPANALOG(m_GND) + m_model.model_value("VLL") + cVd);
m_VREF.set_Q((INPANALOG(m_VCC) + INPANALOG(m_GND)) / 2.0);
m_VH.push(m_VCC() - m_model.model_value("VLH") - cVd);
m_VL.push(m_GND() + m_model.model_value("VLL") + cVd);
m_VREF.push((m_VCC() + m_GND()) / 2.0);
}
NETLIB_RESET(OPAMP)

View File

@ -19,11 +19,11 @@
// Macros
// ----------------------------------------------------------------------------------------
#define OPAMP(name, model) \
NET_REGISTER_DEV(OPAMP, name) \
#define OPAMP(name, model) \
NET_REGISTER_DEV(OPAMP, name) \
NETDEV_PARAMI(name, MODEL, model)
#define LM3900(name) \
#define LM3900(name) \
SUBMODEL(opamp_lm3900, name)
// ----------------------------------------------------------------------------------------
@ -48,7 +48,7 @@ NETLIB_OBJECT(OPAMP)
, m_VL(*this, "VL")
, m_VREF(*this, "VREF")
{
m_type = m_model.model_value("TYPE");
m_type = static_cast<int>(m_model.model_value("TYPE"));
if (m_type == 1)
{
@ -117,7 +117,7 @@ private:
analog_output_t m_VREF;
/* state */
unsigned m_type;
int m_type;
};
} //namespace devices

View File

@ -26,7 +26,7 @@ NETLIB_RESET(switch1)
NETLIB_UPDATE(switch1)
{
if (!m_POS.Value())
if (!m_POS())
{
m_R.set_R(R_OFF);
}
@ -56,7 +56,7 @@ NETLIB_RESET(switch2)
NETLIB_UPDATE(switch2)
{
if (!m_POS.Value())
if (!m_POS())
{
m_R1.set_R(R_ON);
m_R2.set_R(R_OFF);

View File

@ -65,15 +65,15 @@ NETLIB_UPDATE(twoterm)
NETLIB_UPDATE_PARAM(POT)
{
nl_double v = m_Dial.Value();
if (m_DialIsLog.Value())
nl_double v = m_Dial();
if (m_DialIsLog())
v = (std::exp(v) - 1.0) / (std::exp(1.0) - 1.0);
m_R1.update_dev();
m_R2.update_dev();
m_R1.set_R(std::max(m_R.Value() * v, netlist().gmin()));
m_R2.set_R(std::max(m_R.Value() * (NL_FCONST(1.0) - v), netlist().gmin()));
m_R1.set_R(std::max(m_R() * v, netlist().gmin()));
m_R2.set_R(std::max(m_R() * (NL_FCONST(1.0) - v), netlist().gmin()));
}
@ -83,16 +83,16 @@ NETLIB_UPDATE_PARAM(POT)
NETLIB_UPDATE_PARAM(POT2)
{
nl_double v = m_Dial.Value();
nl_double v = m_Dial();
if (m_DialIsLog.Value())
if (m_DialIsLog())
v = (std::exp(v) - 1.0) / (std::exp(1.0) - 1.0);
if (m_Reverse.Value())
if (m_Reverse())
v = 1.0 - v;
m_R1.update_dev();
m_R1.set_R(std::max(m_R.Value() * v, netlist().gmin()));
m_R1.set_R(std::max(m_R() * v, netlist().gmin()));
}
// ----------------------------------------------------------------------------------------
@ -108,7 +108,7 @@ NETLIB_RESET(C)
NETLIB_UPDATE_PARAM(C)
{
//step_time(1.0/48000.0);
m_GParallel = netlist().gmin() * m_C.Value();
m_GParallel = netlist().gmin() * m_C();
}
NETLIB_UPDATE(C)
@ -146,7 +146,7 @@ NETLIB_UPDATE_TERMINALS(D)
NETLIB_RESET(VS)
{
NETLIB_NAME(twoterm)::reset();
this->set(1.0 / m_R, m_V, 0.0);
this->set(1.0 / m_R(), m_V(), 0.0);
}
NETLIB_UPDATE(VS)
@ -161,7 +161,7 @@ NETLIB_UPDATE(VS)
NETLIB_RESET(CS)
{
NETLIB_NAME(twoterm)::reset();
this->set(0.0, 0.0, m_I);
this->set(0.0, 0.0, m_I());
}
NETLIB_UPDATE(CS)

View File

@ -79,16 +79,17 @@
// FIXME: avoid compile fails
// #warning "Do not include rescap.h in a netlist environment"
#endif
#define RES_R(res) ((double)(res))
#define RES_K(res) ((double)(res) * 1e3)
#define RES_M(res) ((double)(res) * 1e6)
#define CAP_U(cap) ((double)(cap) * 1e-6)
#define CAP_N(cap) ((double)(cap) * 1e-9)
#define CAP_P(cap) ((double)(cap) * 1e-12)
#define IND_U(ind) ((double)(ind) * 1e-6)
#define IND_N(ind) ((double)(ind) * 1e-9)
#define IND_P(ind) ((double)(ind) * 1e-12)
#ifndef RES_R
#define RES_R(res) (static_cast<double>(res))
#define RES_K(res) (static_cast<double>(res) * 1e3)
#define RES_M(res) (static_cast<double>(res) * 1e6)
#define CAP_U(cap) (static_cast<double>(cap) * 1e-6)
#define CAP_N(cap) (static_cast<double>(cap) * 1e-9)
#define CAP_P(cap) (static_cast<double>(cap) * 1e-12)
#define IND_U(ind) (static_cast<double>(ind) * 1e-6)
#define IND_N(ind) (static_cast<double>(ind) * 1e-9)
#define IND_P(ind) (static_cast<double>(ind) * 1e-12)
#endif
// -----------------------------------------------------------------------------
// Implementation
@ -196,8 +197,8 @@ protected:
NETLIB_UPDATE_PARAMI()
{
update_dev();
if (m_R.Value() > 1e-9)
set_R(m_R.Value());
if (m_R() > 1e-9)
set_R(m_R());
else
set_R(1e-9);
}
@ -284,7 +285,7 @@ public:
NETLIB_TIMESTEP()
{
/* Gpar should support convergence */
const nl_double G = m_C.Value() / step + m_GParallel;
const nl_double G = m_C() / step + m_GParallel;
const nl_double I = -G * deltaV();
set(G, 0.0, I);
}

File diff suppressed because it is too large Load Diff

View File

@ -162,10 +162,11 @@ depend: .depend
.PHONY: clang
clang:
$(MAKE) CC=clang++ LD=clang++ CEXTRAFLAGS="-Weverything -Werror -Wno-padded -Wno-weak-vtables -Wno-missing-variable-declarations -Wno-conversion -Wno-c++98-compat -Wno-float-equal -Wno-cast-align -Wno-global-constructors -Wno-c++98-compat-pedantic -Wno-exit-time-destructors -Wno-format-nonliteral -Wno-weak-template-vtables"
$(MAKE) CC=clang++ LD=clang++ CEXTRAFLAGS="-Weverything -Werror -Wno-padded -Wno-weak-vtables -Wno-missing-variable-declarations -Wconversion -Wno-c++98-compat -Wno-float-equal -Wno-cast-align -Wno-global-constructors -Wno-c++98-compat-pedantic -Wno-exit-time-destructors -Wno-format-nonliteral -Wno-weak-template-vtables"
# -Wno-old-style-cast
# FIX: -Wno-weak-vtables -Wno-missing-variable-declarations -Wno-conversion -Wno-old-style-cast -Wno-exit-time-destructors
#
# FIX: -Wno-weak-vtables -Wno-missing-variable-declarations -Wno-conversion -Wno-exit-time-destructors
#
#-------------------------------------------------
# generic rules

View File

@ -71,7 +71,6 @@ namespace netlist
{
namespace devices
{
static void initialize_factory(factory_list_t &factory)
{
ENTRY(R, RES, "R")

View File

@ -83,14 +83,14 @@ namespace netlist
NETLIB_UPDATE(CD4020)
{
if (INPLOGIC(m_RESET))
if (m_RESET())
{
m_sub.m_cnt = 0;
m_sub.m_IP.inactivate();
/* static */ const netlist_time reset_time = netlist_time::from_nsec(140);
OUTLOGIC(m_sub.m_Q[0], 0, reset_time);
for (int i=3; i<14; i++)
OUTLOGIC(m_sub.m_Q[i], 0, reset_time);
m_sub.m_Q[0].push(0, reset_time);
for (std::size_t i=3; i<14; i++)
m_sub.m_Q[i].push(0, reset_time);
}
else
m_sub.m_IP.activate_hl();
@ -108,9 +108,9 @@ namespace netlist
NLTIME_FROM_NS(1380), NLTIME_FROM_NS(1480),
};
OUTLOGIC(m_Q[0], cnt & 1, out_delayQn[0]);
for (int i=3; i<14; i++)
OUTLOGIC(m_Q[i], (cnt >> i) & 1, out_delayQn[i]);
m_Q[0].push(cnt & 1, out_delayQn[0]);
for (std::size_t i=3; i<14; i++)
m_Q[i].push((cnt >> i) & 1, out_delayQn[i]);
}
NETLIB_DEVICE_IMPL(CD4020)

View File

@ -40,8 +40,8 @@ namespace netlist
nl_double sup = (m_supply.vdd() - m_supply.vss());
nl_double low = NL_FCONST(0.45) * sup;
nl_double high = NL_FCONST(0.55) * sup;
nl_double in = INPANALOG(m_control) - m_supply.vss();
nl_double rON = m_base_r * NL_FCONST(5.0) / sup;
nl_double in = m_control() - m_supply.vss();
nl_double rON = m_base_r() * NL_FCONST(5.0) / sup;
nl_double R = -1.0;
if (in < low)

View File

@ -121,8 +121,8 @@ namespace netlist
{
const netlist_time delay[2] = { NLTIME_FROM_NS(25), NLTIME_FROM_NS(40) };
OUTLOGIC(m_Q, state, delay[state]);
OUTLOGIC(m_QQ, state ^ 1, delay[state ^ 1]);
m_Q.push(state, delay[state]);
m_QQ.push(state ^ 1, delay[state ^ 1]);
}
NETLIB_UPDATE(74107Asub)
@ -135,7 +135,7 @@ namespace netlist
NETLIB_UPDATE(74107A)
{
const auto JK = (INPLOGIC(m_J) << 1) | INPLOGIC(m_K);
const auto JK = (m_J() << 1) | m_K();
switch (JK)
{
@ -145,17 +145,17 @@ namespace netlist
m_sub.m_F = 0;
m_sub.m_clk.inactivate();
break;
case 1: // (!INPLOGIC(m_J) & INPLOGIC(m_K))
case 1: // (!m_J) & m_K))
m_sub.m_Q1 = 0;
m_sub.m_Q2 = 0;
m_sub.m_F = 0;
break;
case 2: // (INPLOGIC(m_J) & !INPLOGIC(m_K))
case 2: // (m_J) & !m_K))
m_sub.m_Q1 = 0;
m_sub.m_Q2 = 0;
m_sub.m_F = 1;
break;
case 3: // (INPLOGIC(m_J) & INPLOGIC(m_K))
case 3: // (m_J) & m_K))
m_sub.m_Q1 = 1;
m_sub.m_Q2 = 0;
m_sub.m_F = 0;
@ -164,7 +164,7 @@ namespace netlist
break;
}
if (!INPLOGIC(m_clrQ))
if (!m_clrQ())
{
m_sub.m_clk.inactivate();
m_sub.newstate(0);

View File

@ -181,47 +181,47 @@ namespace netlist
NETLIB_UPDATE(74123)
{
netlist_sig_t m_trig;
netlist_sig_t res = !INPLOGIC(m_CLRQ);
netlist_sig_t res = !m_CLRQ();
netlist_time t_AB_to_Q = NLTIME_FROM_NS(10);
netlist_time t_C_to_Q = NLTIME_FROM_NS(10);
if (m_dev_type == 74123)
{
m_trig = (INPLOGIC(m_A) ^ 1) & INPLOGIC(m_B) & INPLOGIC(m_CLRQ);
m_trig = (m_A() ^ 1) & m_B() & m_CLRQ();
}
else if (m_dev_type == 9602)
{
m_trig = (INPLOGIC(m_A) ^ 1) | INPLOGIC(m_B);
m_trig = (m_A() ^ 1) | m_B();
}
else // 4538
{
m_trig = (INPLOGIC(m_B) ^ 1) | INPLOGIC(m_A);
m_trig = (m_B() ^ 1) | m_A();
// The line below is from the datasheet truthtable ... doesn't make sense at all
//res = res | INPLOGIC(m_A) | (INPLOGIC(m_B) ^ 1);
//res = res | m_A) | (m_B) ^ 1);
t_AB_to_Q = NLTIME_FROM_NS(300);
t_C_to_Q = NLTIME_FROM_NS(250);
}
if (res)
{
OUTLOGIC(m_Q, 0, t_C_to_Q);
OUTLOGIC(m_QQ, 1, t_C_to_Q);
m_Q.push(0, t_C_to_Q);
m_QQ.push(1, t_C_to_Q);
/* quick charge until trigger */
/* FIXME: SGS datasheet shows quick charge to 5V,
* though schematics indicate quick charge to Vhigh only.
*/
OUTLOGIC(m_RP_Q, 1, t_C_to_Q); // R_ON
OUTLOGIC(m_RN_Q, 0, t_C_to_Q); // R_OFF
m_RP_Q.push(1, t_C_to_Q); // R_ON
m_RN_Q.push(0, t_C_to_Q); // R_OFF
m_state = 2; //charging (quick)
}
else if (!m_last_trig && m_trig)
{
// FIXME: Timing!
OUTLOGIC(m_Q, 1, t_AB_to_Q);
OUTLOGIC(m_QQ, 0,t_AB_to_Q);
m_Q.push(1, t_AB_to_Q);
m_QQ.push(0,t_AB_to_Q);
OUTLOGIC(m_RN_Q, 1, t_AB_to_Q); // R_ON
OUTLOGIC(m_RP_Q, 0, t_AB_to_Q); // R_OFF
m_RN_Q.push(1, t_AB_to_Q); // R_ON
m_RP_Q.push(0, t_AB_to_Q); // R_OFF
m_state = 1; // discharging
}
@ -230,22 +230,22 @@ namespace netlist
if (m_state == 1)
{
const nl_double vLow = m_KP * TERMANALOG(m_RP.m_R.m_P);
if (INPANALOG(m_CV) < vLow)
const nl_double vLow = m_KP * m_RP.m_R.m_P();
if (m_CV() < vLow)
{
OUTLOGIC(m_RN_Q, 0, NLTIME_FROM_NS(10)); // R_OFF
m_RN_Q.push(0, NLTIME_FROM_NS(10)); // R_OFF
m_state = 2; // charging
}
}
if (m_state == 2)
{
const nl_double vHigh = TERMANALOG(m_RP.m_R.m_P) * (1.0 - m_KP);
if (INPANALOG(m_CV) > vHigh)
const nl_double vHigh = m_RP.m_R.m_P() * (1.0 - m_KP);
if (m_CV() > vHigh)
{
OUTLOGIC(m_RP_Q, 0, NLTIME_FROM_NS(10)); // R_OFF
m_RP_Q.push(0, NLTIME_FROM_NS(10)); // R_OFF
OUTLOGIC(m_Q, 0, NLTIME_FROM_NS(10));
OUTLOGIC(m_QQ, 1, NLTIME_FROM_NS(10));
m_Q.push(0, NLTIME_FROM_NS(10));
m_QQ.push(1, NLTIME_FROM_NS(10));
m_state = 0; // waiting
}
}
@ -253,7 +253,7 @@ namespace netlist
NETLIB_RESET(74123)
{
m_KP = 1.0 / (1.0 + exp(m_K.Value()));
m_KP = 1.0 / (1.0 + exp(m_K()));
m_RP.do_reset();
m_RN.do_reset();

View File

@ -104,28 +104,28 @@ namespace netlist
NETLIB_UPDATE(74153sub)
{
const netlist_time delay[2] = { NLTIME_FROM_NS(23), NLTIME_FROM_NS(18) };
if (!INPLOGIC(m_G))
if (!m_G())
{
uint_fast8_t t = INPLOGIC(m_C[m_chan]);
OUTLOGIC(m_Y, t, delay[t] );
auto t = m_C[m_chan]();
m_Y.push(t, delay[t]);
}
else
{
OUTLOGIC(m_Y, 0, delay[0]);
m_Y.push(0, delay[0]);
}
}
NETLIB_UPDATE(74153)
{
m_sub.m_chan = (INPLOGIC(m_A) | (INPLOGIC(m_B)<<1));
m_sub.m_chan = (m_A() | (m_B()<<1));
m_sub.do_update();
}
NETLIB_UPDATE(74153_dip)
{
m_2.m_chan = m_1.m_chan = (INPLOGIC(m_A) | (INPLOGIC(m_B)<<1));
m_2.m_chan = m_1.m_chan = (m_A() | (m_B()<<1));
m_1.do_update();
m_2.do_update();
}

View File

@ -105,11 +105,11 @@ namespace netlist
{
if (m_clrq)
{
for (int i=0; i<4; i++)
for (std::size_t i=0; i<4; i++)
{
netlist_sig_t d = (m_data >> i) & 1;
OUTLOGIC(m_Q[i], d, delay[d]);
OUTLOGIC(m_QQ[i], d ^ 1, delay[d ^ 1]);
m_Q[i].push(d, delay[d]);
m_QQ[i].push(d ^ 1, delay[d ^ 1]);
}
m_CLK.inactivate();
}
@ -118,17 +118,17 @@ namespace netlist
NETLIB_UPDATE(74175)
{
uint_fast8_t d = 0;
for (int i=0; i<4; i++)
for (std::size_t i=0; i<4; i++)
{
d |= (INPLOGIC(m_D[i]) << i);
d |= (m_D[i]() << i);
}
m_sub.m_clrq = INPLOGIC(m_CLRQ);
m_sub.m_clrq = m_CLRQ();
if (!m_sub.m_clrq)
{
for (int i=0; i<4; i++)
for (std::size_t i=0; i<4; i++)
{
OUTLOGIC(m_sub.m_Q[i], 0, delay_clear[0]);
OUTLOGIC(m_sub.m_QQ[i], 1, delay_clear[1]);
m_sub.m_Q[i].push(0, delay_clear[0]);
m_sub.m_QQ[i].push(1, delay_clear[1]);
}
m_sub.m_data = 0;
} else if (d != m_sub.m_data)

View File

@ -32,10 +32,9 @@ namespace netlist
logic_input_t m_C;
logic_input_t m_D;
uint_fast8_t read_ABCD() const
unsigned read_ABCD() const
{
//return (INPLOGIC_PASSIVE(m_D) << 3) | (INPLOGIC_PASSIVE(m_C) << 2) | (INPLOGIC_PASSIVE(m_B) << 1) | (INPLOGIC_PASSIVE(m_A) << 0);
return (INPLOGIC(m_D) << 3) | (INPLOGIC(m_C) << 2) | (INPLOGIC(m_B) << 1) | (INPLOGIC(m_A) << 0);
return (m_D() << 3) | (m_C() << 2) | (m_B() << 1) | (m_A() << 0);
}
};
@ -70,7 +69,7 @@ namespace netlist
logic_input_t m_CU;
logic_input_t m_CD;
state_var<int> m_cnt;
state_var<unsigned> m_cnt;
state_var<unsigned> m_last_CU;
state_var<unsigned> m_last_CD;
@ -119,25 +118,25 @@ namespace netlist
NETLIB_UPDATE(74192)
{
int tCarry = 1;
int tBorrow = 1;
if (INPLOGIC(m_CLEAR))
netlist_sig_t tCarry = 1;
netlist_sig_t tBorrow = 1;
if (m_CLEAR())
{
m_cnt = 0;
}
else if (!INPLOGIC(m_LOADQ))
else if (!m_LOADQ())
{
m_cnt = m_ABCD.read_ABCD();
}
else
{
if (INPLOGIC(m_CD) && !m_last_CU && INPLOGIC(m_CU))
if (m_CD() && !m_last_CU && m_CU())
{
m_cnt++;
if (m_cnt > MAXCNT)
m_cnt = 0;
}
if (INPLOGIC(m_CU) && !m_last_CD && INPLOGIC(m_CD))
if (m_CU() && !m_last_CD && m_CD())
{
if (m_cnt > 0)
m_cnt--;
@ -146,20 +145,20 @@ namespace netlist
}
}
if (!INPLOGIC(m_CU) && (m_cnt == MAXCNT))
if (!m_CU() && (m_cnt == MAXCNT))
tCarry = 0;
if (!INPLOGIC(m_CD) && (m_cnt == 0))
if (!m_CD() && (m_cnt == 0))
tBorrow = 0;
m_last_CD = INPLOGIC(m_CD);
m_last_CU = INPLOGIC(m_CU);
m_last_CD = m_CD();
m_last_CU = m_CU();
for (int i=0; i<4; i++)
OUTLOGIC(m_Q[i], (m_cnt >> i) & 1, delay[i]);
for (std::size_t i=0; i<4; i++)
m_Q[i].push((m_cnt >> i) & 1, delay[i]);
OUTLOGIC(m_BORROWQ, tBorrow, NLTIME_FROM_NS(20)); //FIXME
OUTLOGIC(m_CARRYQ, tCarry, NLTIME_FROM_NS(20)); //FIXME
m_BORROWQ.push(tBorrow, NLTIME_FROM_NS(20)); //FIXME
m_CARRYQ.push(tCarry, NLTIME_FROM_NS(20)); //FIXME
}
NETLIB_DEVICE_IMPL(74192)

View File

@ -46,7 +46,7 @@ namespace netlist
logic_input_t m_CU;
logic_input_t m_CD;
state_var<int> m_cnt;
state_var<unsigned> m_cnt;
state_var<unsigned> m_last_CU;
state_var<unsigned> m_last_CD;
@ -96,26 +96,26 @@ namespace netlist
NETLIB_UPDATE(74193)
{
int tCarry = 1;
int tBorrow = 1;
if (INPLOGIC(m_CLEAR))
netlist_sig_t tCarry = 1;
netlist_sig_t tBorrow = 1;
if (m_CLEAR())
{
m_cnt = 0;
}
else if (!INPLOGIC(m_LOADQ))
else if (!m_LOADQ())
{
m_cnt = (INPLOGIC(m_D) << 3) | (INPLOGIC(m_C) << 2)
| (INPLOGIC(m_B) << 1) | (INPLOGIC(m_A) << 0);
m_cnt = (m_D() << 3) | (m_C() << 2)
| (m_B() << 1) | (m_A() << 0);
}
else
{
if (INPLOGIC(m_CD) && !m_last_CU && INPLOGIC(m_CU))
if (m_CD() && !m_last_CU && m_CU())
{
m_cnt++;
if (m_cnt > MAXCNT)
m_cnt = 0;
}
if (INPLOGIC(m_CU) && !m_last_CD && INPLOGIC(m_CD))
if (m_CU() && !m_last_CD && m_CD())
{
if (m_cnt > 0)
m_cnt--;
@ -124,20 +124,20 @@ namespace netlist
}
}
if (!INPLOGIC(m_CU) && (m_cnt == MAXCNT))
if (!m_CU() && (m_cnt == MAXCNT))
tCarry = 0;
if (!INPLOGIC(m_CD) && (m_cnt == 0))
if (!m_CD() && (m_cnt == 0))
tBorrow = 0;
m_last_CD = INPLOGIC(m_CD);
m_last_CU = INPLOGIC(m_CU);
m_last_CD = m_CD();
m_last_CU = m_CU();
for (int i=0; i<4; i++)
OUTLOGIC(m_Q[i], (m_cnt >> i) & 1, delay[i]);
for (std::size_t i=0; i<4; i++)
m_Q[i].push((m_cnt >> i) & 1, delay[i]);
OUTLOGIC(m_BORROWQ, tBorrow, NLTIME_FROM_NS(20)); //FIXME
OUTLOGIC(m_CARRYQ, tCarry, NLTIME_FROM_NS(20)); //FIXME
m_BORROWQ.push(tBorrow, NLTIME_FROM_NS(20)); //FIXME
m_CARRYQ.push(tCarry, NLTIME_FROM_NS(20)); //FIXME
}
NETLIB_DEVICE_IMPL(74193)

View File

@ -37,7 +37,7 @@ namespace netlist
NETLIB_UPDATEI();
public:
void update_outputs(uint_fast8_t v);
void update_outputs(unsigned v);
static const uint_fast8_t tab7448[16][7];
logic_input_t m_A;
@ -136,18 +136,18 @@ namespace netlist
NETLIB_UPDATE(7448)
{
if (!INPLOGIC(m_BIQ) || (INPLOGIC(m_BIQ) && !INPLOGIC(m_LTQ)))
if (!m_BIQ() || (m_BIQ() && !m_LTQ()))
{
m_A.inactivate();
m_B.inactivate();
m_C.inactivate();
m_D.inactivate();
m_RBIQ.inactivate();
if (INPLOGIC(m_BIQ) && !INPLOGIC(m_LTQ))
if (m_BIQ() && !m_LTQ())
{
update_outputs(8);
}
else if (!INPLOGIC(m_BIQ))
else if (!m_BIQ())
{
update_outputs(15);
}
@ -157,10 +157,10 @@ namespace netlist
m_C.activate();
m_B.activate();
m_A.activate();
uint_fast8_t v;
unsigned v;
v = (INPLOGIC(m_A) << 0) | (INPLOGIC(m_B) << 1) | (INPLOGIC(m_C) << 2) | (INPLOGIC(m_D) << 3);
if ((!INPLOGIC(m_RBIQ) && (v==0)))
v = (m_A() << 0) | (m_B() << 1) | (m_C() << 2) | (m_D() << 3);
if ((!m_RBIQ() && (v==0)))
v = 15;
update_outputs(v);
}
@ -176,15 +176,15 @@ namespace netlist
m_RBIQ.inactivate();
}
NETLIB_FUNC_VOID(7448, update_outputs, (uint_fast8_t v))
NETLIB_FUNC_VOID(7448, update_outputs, (unsigned v))
{
nl_assert(v<16);
if (v != m_state)
{
// max transfer time is 100 NS */
for (int i=0; i<7; i++)
OUTLOGIC(m_Q[i], tab7448[v][i], NLTIME_FROM_NS(100));
for (std::size_t i=0; i<7; i++)
m_Q[i].push(tab7448[v][i], NLTIME_FROM_NS(100));
m_state = v;
}
}

View File

@ -1,4 +1,4 @@
// license:GPL-2.0+
// license:GPL-2.0+
// copyright-holders:Couriersud
/*
* nld_7450.c
@ -67,8 +67,8 @@ namespace netlist
m_B.activate();
m_C.activate();
m_D.activate();
uint_fast8_t t1 = INPLOGIC(m_A) & INPLOGIC(m_B);
uint_fast8_t t2 = INPLOGIC(m_C) & INPLOGIC(m_D);
unsigned t1 = m_A() & m_B();
unsigned t2 = m_C() & m_D();
const netlist_time times[2] = { NLTIME_FROM_NS(22), NLTIME_FROM_NS(15) };
@ -91,7 +91,7 @@ namespace netlist
m_D.inactivate();
}
}
OUTLOGIC(m_Q, res, times[1 - res]);// ? 22000 : 15000);
m_Q.push(res, times[1 - res]);// ? 22000 : 15000);
}
NETLIB_DEVICE_IMPL(7450)

View File

@ -95,8 +95,8 @@ namespace netlist
{
// 0: High-to-low 40 ns, 1: Low-to-high 25 ns
const netlist_time delay[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) };
OUTLOGIC(m_Q, stateQ, delay[stateQ]);
OUTLOGIC(m_QQ, stateQQ, delay[stateQQ]);
m_Q.push(stateQ, delay[stateQ]);
m_QQ.push(stateQQ, delay[stateQQ]);
}
NETLIB_UPDATE(7474sub)
@ -110,19 +110,19 @@ namespace netlist
NETLIB_UPDATE(7474)
{
if (INPLOGIC(m_PREQ) && INPLOGIC(m_CLRQ))
if (m_PREQ() && m_CLRQ())
{
m_D.activate();
sub.m_nextD = INPLOGIC(m_D);
sub.m_nextD = m_D();
sub.m_CLK.activate_lh();
}
else if (!INPLOGIC(m_PREQ))
else if (!m_PREQ())
{
sub.newstate(1, 0);
sub.m_CLK.inactivate();
m_D.inactivate();
}
else if (!INPLOGIC(m_CLRQ))
else if (!m_CLRQ())
{
sub.newstate(0, 1);
sub.m_CLK.inactivate();

View File

@ -88,19 +88,19 @@ namespace netlist
NETLIB_UPDATE(7483)
{
uint_fast8_t a = (INPLOGIC(m_A1) << 0) | (INPLOGIC(m_A2) << 1) | (INPLOGIC(m_A3) << 2) | (INPLOGIC(m_A4) << 3);
uint_fast8_t b = (INPLOGIC(m_B1) << 0) | (INPLOGIC(m_B2) << 1) | (INPLOGIC(m_B3) << 2) | (INPLOGIC(m_B4) << 3);
netlist_sig_t a = (m_A1() << 0) | (m_A2() << 1) | (m_A3() << 2) | (m_A4() << 3);
netlist_sig_t b = (m_B1() << 0) | (m_B2() << 1) | (m_B3() << 2) | (m_B4() << 3);
uint_fast8_t r = a + b + INPLOGIC(m_C0);
unsigned r = a + b + m_C0();
if (r != m_lastr)
{
m_lastr = r;
OUTLOGIC(m_S1, (r >> 0) & 1, NLTIME_FROM_NS(23));
OUTLOGIC(m_S2, (r >> 1) & 1, NLTIME_FROM_NS(23));
OUTLOGIC(m_S3, (r >> 2) & 1, NLTIME_FROM_NS(23));
OUTLOGIC(m_S4, (r >> 3) & 1, NLTIME_FROM_NS(23));
OUTLOGIC(m_C4, (r >> 4) & 1, NLTIME_FROM_NS(23));
m_S1.push((r >> 0) & 1, NLTIME_FROM_NS(23));
m_S2.push((r >> 1) & 1, NLTIME_FROM_NS(23));
m_S3.push((r >> 2) & 1, NLTIME_FROM_NS(23));
m_S4.push((r >> 3) & 1, NLTIME_FROM_NS(23));
m_C4.push((r >> 4) & 1, NLTIME_FROM_NS(23));
}
}

View File

@ -41,8 +41,8 @@ namespace netlist
logic_input_t m_R92;
state_var_u8 m_cnt;
state_var_u8 m_last_A;
state_var_u8 m_last_B;
state_var<netlist_sig_t> m_last_A;
state_var<netlist_sig_t> m_last_B;
object_array_t<logic_output_t, 4> m_Q;
};
@ -86,15 +86,15 @@ namespace netlist
NETLIB_UPDATE(7490)
{
const netlist_sig_t new_A = INPLOGIC(m_A);
const netlist_sig_t new_B = INPLOGIC(m_B);
const netlist_sig_t new_A = m_A();
const netlist_sig_t new_B = m_B();
if (INPLOGIC(m_R91) & INPLOGIC(m_R92))
if (m_R91() & m_R92())
{
m_cnt = 9;
update_outputs();
}
else if (INPLOGIC(m_R1) & INPLOGIC(m_R2))
else if (m_R1() & m_R2())
{
m_cnt = 0;
update_outputs();
@ -104,7 +104,7 @@ namespace netlist
if (m_last_A && !new_A) // High - Low
{
m_cnt ^= 1;
OUTLOGIC(m_Q[0], m_cnt & 1, delay[0]);
m_Q[0].push(m_cnt & 1, delay[0]);
}
if (m_last_B && !new_B) // High - Low
{
@ -120,8 +120,8 @@ namespace netlist
NETLIB_FUNC_VOID(7490, update_outputs, (void))
{
for (int i=0; i<4; i++)
OUTLOGIC(m_Q[i], (m_cnt >> i) & 1, delay[i]);
for (std::size_t i=0; i<4; i++)
m_Q[i].push((m_cnt >> i) & 1, delay[i]);
}
NETLIB_DEVICE_IMPL(7490)

View File

@ -103,22 +103,22 @@ namespace netlist
if (m_reset)
{
m_state ^= 1;
OUTLOGIC(m_Q, m_state, out_delay);
m_Q.push(m_state, out_delay);
}
}
NETLIB_UPDATE(7493)
{
const netlist_sig_t r = INPLOGIC(m_R1) & INPLOGIC(m_R2);
const netlist_sig_t r = m_R1() & m_R2();
if (r)
{
A.m_I.inactivate();
B.m_I.inactivate();
OUTLOGIC(A.m_Q, 0, NLTIME_FROM_NS(40));
OUTLOGIC(B.m_Q, 0, NLTIME_FROM_NS(40));
OUTLOGIC(C.m_Q, 0, NLTIME_FROM_NS(40));
OUTLOGIC(D.m_Q, 0, NLTIME_FROM_NS(40));
A.m_Q.push(0, NLTIME_FROM_NS(40));
B.m_Q.push(0, NLTIME_FROM_NS(40));
C.m_Q.push(0, NLTIME_FROM_NS(40));
D.m_Q.push(0, NLTIME_FROM_NS(40));
A.m_reset = B.m_reset = C.m_reset = D.m_reset = 0;
A.m_state = B.m_state = C.m_state = D.m_state = 0;
}

View File

@ -160,11 +160,11 @@ namespace netlist
if (!m_enableq)
{
m_out = m_out ^ 1;
OUTLOGIC(m_Y, m_out, m_inc);
m_Y.push(m_out, m_inc);
}
else
{
OUTLOGIC(m_Y, 1, m_inc);
m_Y.push(1, m_inc);
}
}
@ -174,8 +174,8 @@ namespace netlist
// recompute
nl_double freq;
nl_double v_freq_2, v_freq_3, v_freq_4;
nl_double v_freq = INPANALOG(m_FC);
nl_double v_rng = INPANALOG(m_RNG);
nl_double v_freq = m_FC();
nl_double v_rng = m_RNG();
/* coefficients */
const nl_double k1 = 1.9904769024796283E+03;
@ -207,27 +207,27 @@ namespace netlist
freq += k9 * v_rng * v_freq_3;
freq += k10 * v_rng * v_freq_4;
freq *= NL_FCONST(0.1e-6) / m_CAP;
freq *= NL_FCONST(0.1e-6) / m_CAP();
// FIXME: we need a possibility to remove entries from queue ...
// or an exact model ...
m_clock.m_inc = netlist_time::from_double(0.5 / (double) freq);
m_clock.m_inc = netlist_time::from_double(0.5 / freq);
//m_clock.update();
//NL_VERBOSE_OUT(("{1} {2} {3} {4}\n", name(), v_freq, v_rng, freq));
}
if (!m_clock.m_enableq && INPLOGIC(m_ENQ))
if (!m_clock.m_enableq && m_ENQ())
{
m_clock.m_enableq = 1;
m_clock.m_out = m_clock.m_out ^ 1;
OUTLOGIC(m_clock.m_Y, m_clock.m_out, netlist_time::from_nsec(1));
m_clock.m_Y.push(m_clock.m_out, netlist_time::from_nsec(1));
}
else if (m_clock.m_enableq && !INPLOGIC(m_ENQ))
else if (m_clock.m_enableq && !m_ENQ())
{
m_clock.m_enableq = 0;
m_clock.m_out = m_clock.m_out ^ 1;
OUTLOGIC(m_clock.m_Y, m_clock.m_out, netlist_time::from_nsec(1));
m_clock.m_Y.push(m_clock.m_out, netlist_time::from_nsec(1));
}
}

View File

@ -68,33 +68,35 @@ namespace netlist
// FIXME: optimize device (separate address decoder!)
NETLIB_UPDATE(82S16)
{
if (INPLOGIC(m_CE1Q) || INPLOGIC(m_CE2Q) || INPLOGIC(m_CE3Q))
if (m_CE1Q() || m_CE2Q() || m_CE3Q())
{
// FIXME: Outputs are tristate. This needs to be properly implemented
OUTLOGIC(m_DOUTQ, 1, NLTIME_FROM_NS(20));
m_DOUTQ.push(1, NLTIME_FROM_NS(20));
//for (int i=0; i<8; i++)
//m_A[i].inactivate();
}
else
{
unsigned int adr = 0;
for (int i=0; i<8; i++)
for (std::size_t i=0; i<8; i++)
{
//m_A[i].activate();
adr |= (INPLOGIC(m_A[i]) << i);
adr |= (m_A[i]() << i);
}
if (!INPLOGIC(m_WEQ))
if (!m_WEQ())
{
m_ram[adr >> 6] = (m_ram[adr >> 6] & ~((uint_fast64_t) 1 << (adr & 0x3f))) | ((uint_fast64_t) INPLOGIC(m_DIN) << (adr & 0x3f));
m_ram[adr >> 6] = (m_ram[adr >> 6]
& ~(static_cast<uint_fast64_t>(1) << (adr & 0x3f)))
| (static_cast<uint_fast64_t>(m_DIN()) << (adr & 0x3f));
}
OUTLOGIC(m_DOUTQ, ((m_ram[adr >> 6] >> (adr & 0x3f)) & 1) ^ 1, NLTIME_FROM_NS(20));
m_DOUTQ.push(((m_ram[adr >> 6] >> (adr & 0x3f)) & 1) ^ 1, NLTIME_FROM_NS(20));
}
}
NETLIB_RESET(82S16)
{
for (int i=0; i<4; i++)
for (std::size_t i=0; i<4; i++)
{
m_ram[i] = 0;
}

View File

@ -32,10 +32,9 @@ namespace netlist
logic_input_t m_C;
logic_input_t m_D;
uint_fast8_t read_ABCD() const
unsigned read_ABCD() const
{
//return (INPLOGIC_PASSIVE(m_D) << 3) | (INPLOGIC_PASSIVE(m_C) << 2) | (INPLOGIC_PASSIVE(m_B) << 1) | (INPLOGIC_PASSIVE(m_A) << 0);
return (INPLOGIC(m_D) << 3) | (INPLOGIC(m_C) << 2) | (INPLOGIC(m_B) << 1) | (INPLOGIC(m_A) << 0);
return (m_D() << 3) | (m_C() << 2) | (m_B() << 1) | (m_A() << 0);
}
};
@ -57,8 +56,8 @@ namespace netlist
NETLIB_RESETI();
NETLIB_UPDATEI();
public:
inline void update_outputs_all(const uint_fast8_t cnt, const netlist_time out_delay);
inline void update_outputs(const uint_fast8_t cnt);
inline void update_outputs_all(const unsigned cnt, const netlist_time out_delay);
inline void update_outputs(const unsigned cnt);
logic_input_t m_CLK;
@ -70,9 +69,9 @@ namespace netlist
logic_output_t m_QD;
logic_output_t m_RC;
state_var_u8 m_cnt;
state_var_u8 m_loadq;
state_var_u8 m_ent;
state_var<unsigned> m_cnt;
state_var<netlist_sig_t> m_loadq;
state_var<netlist_sig_t> m_ent;
};
NETLIB_OBJECT(9310)
@ -163,11 +162,11 @@ namespace netlist
{
case MAXCNT - 1:
m_cnt = MAXCNT;
OUTLOGIC(m_RC, m_ent, NLTIME_FROM_NS(20));
OUTLOGIC(m_QA, 1, NLTIME_FROM_NS(20));
m_RC.push(m_ent, NLTIME_FROM_NS(20));
m_QA.push(1, NLTIME_FROM_NS(20));
break;
case MAXCNT:
OUTLOGIC(m_RC, 0, NLTIME_FROM_NS(20));
m_RC.push(0, NLTIME_FROM_NS(20));
m_cnt = 0;
update_outputs_all(m_cnt, NLTIME_FROM_NS(20));
break;
@ -180,20 +179,20 @@ namespace netlist
{
m_cnt = m_ABCD->read_ABCD();
update_outputs_all(m_cnt, NLTIME_FROM_NS(22));
OUTLOGIC(m_RC, m_ent & (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
m_RC.push(m_ent & (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
}
}
NETLIB_UPDATE(9310)
{
sub.m_loadq = INPLOGIC(m_LOADQ);
sub.m_ent = INPLOGIC(m_ENT);
const netlist_sig_t clrq = INPLOGIC(m_CLRQ);
sub.m_loadq = m_LOADQ();
sub.m_ent = m_ENT();
const netlist_sig_t clrq = m_CLRQ();
if ((!sub.m_loadq || (sub.m_ent & INPLOGIC(m_ENP))) && clrq)
if ((!sub.m_loadq || (sub.m_ent & m_ENP())) && clrq)
{
sub.m_CLK.activate_lh();
OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27));
sub.m_RC.push(sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27));
}
else
{
@ -204,56 +203,56 @@ namespace netlist
sub.m_cnt = 0;
//return;
}
OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27));
sub.m_RC.push(sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27));
}
}
inline NETLIB_FUNC_VOID(9310_sub, update_outputs_all, (const uint_fast8_t cnt, const netlist_time out_delay))
inline NETLIB_FUNC_VOID(9310_sub, update_outputs_all, (const unsigned cnt, const netlist_time out_delay))
{
OUTLOGIC(m_QA, (cnt >> 0) & 1, out_delay);
OUTLOGIC(m_QB, (cnt >> 1) & 1, out_delay);
OUTLOGIC(m_QC, (cnt >> 2) & 1, out_delay);
OUTLOGIC(m_QD, (cnt >> 3) & 1, out_delay);
m_QA.push((cnt >> 0) & 1, out_delay);
m_QB.push((cnt >> 1) & 1, out_delay);
m_QC.push((cnt >> 2) & 1, out_delay);
m_QD.push((cnt >> 3) & 1, out_delay);
}
inline NETLIB_FUNC_VOID(9310_sub, update_outputs, (const uint_fast8_t cnt))
inline NETLIB_FUNC_VOID(9310_sub, update_outputs, (const unsigned cnt))
{
/* static */ const netlist_time out_delay = NLTIME_FROM_NS(20);
#if 0
// for (int i=0; i<4; i++)
// OUTLOGIC(m_Q[i], (cnt >> i) & 1, delay[i]);
OUTLOGIC(m_QA, (cnt >> 0) & 1, out_delay);
OUTLOGIC(m_QB, (cnt >> 1) & 1, out_delay);
OUTLOGIC(m_QC, (cnt >> 2) & 1, out_delay);
OUTLOGIC(m_QD, (cnt >> 3) & 1, out_delay);
// m_Q[i], (cnt >> i) & 1, delay[i]);
m_QA, (cnt >> 0) & 1, out_delay);
m_QB, (cnt >> 1) & 1, out_delay);
m_QC, (cnt >> 2) & 1, out_delay);
m_QD, (cnt >> 3) & 1, out_delay);
#else
if ((cnt & 1) == 1)
OUTLOGIC(m_QA, 1, out_delay);
m_QA.push(1, out_delay);
else
{
OUTLOGIC(m_QA, 0, out_delay);
m_QA.push(0, out_delay);
switch (cnt)
{
case 0x00:
OUTLOGIC(m_QB, 0, out_delay);
OUTLOGIC(m_QC, 0, out_delay);
OUTLOGIC(m_QD, 0, out_delay);
m_QB.push(0, out_delay);
m_QC.push(0, out_delay);
m_QD.push(0, out_delay);
break;
case 0x02:
case 0x06:
case 0x0A:
case 0x0E:
OUTLOGIC(m_QB, 1, out_delay);
m_QB.push(1, out_delay);
break;
case 0x04:
case 0x0C:
OUTLOGIC(m_QB, 0, out_delay);
OUTLOGIC(m_QC, 1, out_delay);
m_QB.push(0, out_delay);
m_QC.push(1, out_delay);
break;
case 0x08:
OUTLOGIC(m_QB, 0, out_delay);
OUTLOGIC(m_QC, 0, out_delay);
OUTLOGIC(m_QD, 1, out_delay);
m_QB.push(0, out_delay);
m_QC.push(0, out_delay);
m_QD.push(1, out_delay);
break;
}

View File

@ -32,10 +32,9 @@ namespace netlist
logic_input_t m_C;
logic_input_t m_D;
uint_fast8_t read_ABCD() const
unsigned read_ABCD() const
{
//return (INPLOGIC_PASSIVE(m_D) << 3) | (INPLOGIC_PASSIVE(m_C) << 2) | (INPLOGIC_PASSIVE(m_B) << 1) | (INPLOGIC_PASSIVE(m_A) << 0);
return (INPLOGIC(m_D) << 3) | (INPLOGIC(m_C) << 2) | (INPLOGIC(m_B) << 1) | (INPLOGIC(m_A) << 0);
return (m_D() << 3) | (m_C() << 2) | (m_B() << 1) | (m_A() << 0);
}
};
@ -59,19 +58,19 @@ namespace netlist
NETLIB_UPDATEI();
public:
void update_outputs_all(const uint_fast8_t cnt, const netlist_time out_delay)
void update_outputs_all(const unsigned cnt, const netlist_time out_delay)
{
OUTLOGIC(m_QA, (cnt >> 0) & 1, out_delay);
OUTLOGIC(m_QB, (cnt >> 1) & 1, out_delay);
OUTLOGIC(m_QC, (cnt >> 2) & 1, out_delay);
OUTLOGIC(m_QD, (cnt >> 3) & 1, out_delay);
m_QA.push((cnt >> 0) & 1, out_delay);
m_QB.push((cnt >> 1) & 1, out_delay);
m_QC.push((cnt >> 2) & 1, out_delay);
m_QD.push((cnt >> 3) & 1, out_delay);
}
logic_input_t m_CLK;
state_var_u8 m_cnt;
state_var_u8 m_loadq;
state_var_u8 m_ent;
state_var<unsigned> m_cnt;
state_var<netlist_sig_t> m_loadq;
state_var<netlist_sig_t> m_ent;
logic_output_t m_QA;
logic_output_t m_QB;
@ -166,11 +165,11 @@ namespace netlist
{
case MAXCNT - 1:
m_cnt = MAXCNT;
OUTLOGIC(m_RC, m_ent, NLTIME_FROM_NS(27));
OUTLOGIC(m_QA, 1, NLTIME_FROM_NS(20));
m_RC.push(m_ent, NLTIME_FROM_NS(27));
m_QA.push(1, NLTIME_FROM_NS(20));
break;
case MAXCNT:
OUTLOGIC(m_RC, 0, NLTIME_FROM_NS(27));
m_RC.push(0, NLTIME_FROM_NS(27));
m_cnt = 0;
update_outputs_all(m_cnt, NLTIME_FROM_NS(20));
break;
@ -183,21 +182,21 @@ namespace netlist
else
{
m_cnt = m_ABCD->read_ABCD();
OUTLOGIC(m_RC, m_ent & (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
m_RC.push(m_ent & (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
update_outputs_all(m_cnt, NLTIME_FROM_NS(22));
}
}
NETLIB_UPDATE(9316)
{
sub.m_loadq = INPLOGIC(m_LOADQ);
sub.m_ent = INPLOGIC(m_ENT);
const netlist_sig_t clrq = INPLOGIC(m_CLRQ);
sub.m_loadq = m_LOADQ();
sub.m_ent = m_ENT();
const netlist_sig_t clrq = m_CLRQ();
if (((sub.m_loadq ^ 1) | (sub.m_ent & INPLOGIC(m_ENP))) & clrq)
if (((sub.m_loadq ^ 1) | (sub.m_ent & m_ENP())) & clrq)
{
sub.m_CLK.activate_lh();
OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27));
sub.m_RC.push(sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27));
}
else
{
@ -208,7 +207,7 @@ namespace netlist
sub.m_cnt = 0;
//return;
}
OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27));
sub.m_RC.push(sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27));
}
}

View File

@ -56,7 +56,7 @@ namespace netlist
param_int_t m_L_to_H;
param_int_t m_H_to_L;
state_var_u8 m_last;
state_var<netlist_sig_t> m_last;
};
NETLIB_RESET(nicRSFF)
@ -67,15 +67,15 @@ namespace netlist
NETLIB_UPDATE(nicRSFF)
{
if (!INPLOGIC(m_S))
if (!m_S())
{
OUTLOGIC(m_Q, 1, NLTIME_FROM_NS(20));
OUTLOGIC(m_QQ, 0, NLTIME_FROM_NS(20));
m_Q.push(1, NLTIME_FROM_NS(20));
m_QQ.push(0, NLTIME_FROM_NS(20));
}
else if (!INPLOGIC(m_R))
else if (!m_R())
{
OUTLOGIC(m_Q, 0, NLTIME_FROM_NS(20));
OUTLOGIC(m_QQ, 1, NLTIME_FROM_NS(20));
m_Q.push(0, NLTIME_FROM_NS(20));
m_QQ.push(1, NLTIME_FROM_NS(20));
}
}
@ -86,16 +86,16 @@ namespace netlist
NETLIB_UPDATE(nicDelay)
{
netlist_sig_t nval = INPLOGIC(m_I);
netlist_sig_t nval = m_I();
if (nval && !m_last)
{
// L_to_H
OUTLOGIC(m_Q, 1, NLTIME_FROM_NS(m_L_to_H.Value()));
m_Q.push(1, NLTIME_FROM_NS(static_cast<unsigned>(m_L_to_H())));
}
else if (!nval && m_last)
{
// H_to_L
OUTLOGIC(m_Q, 0, NLTIME_FROM_NS(m_H_to_L.Value()));
m_Q.push(0, NLTIME_FROM_NS(static_cast<unsigned>(m_H_to_L())));
}
m_last = nval;
}

View File

@ -28,7 +28,7 @@ namespace netlist
NETLIB_UPDATEI()
{
/* use pstring::sprintf, it is a LOT faster */
m_strm->writeline(plib::pfmt("{1} {2}").e(netlist().time().as_double(),".9").e((nl_double) INPANALOG(m_I)));
m_strm->writeline(plib::pfmt("{1} {2}").e(netlist().time().as_double(),".9").e(static_cast<double>(m_I())));
}
NETLIB_RESETI() { }
@ -46,7 +46,7 @@ namespace netlist
NETLIB_UPDATEI()
{
m_strm->writeline(plib::pfmt("{1} {2}").e(netlist().time().as_double(),".9").e((nl_double) (INPANALOG(m_I) - INPANALOG(m_I2))));
m_strm->writeline(plib::pfmt("{1} {2}").e(netlist().time().as_double(),".9").e(static_cast<double>(m_I() - m_I2())));
}
NETLIB_RESETI() { }
@ -79,7 +79,7 @@ namespace netlist
NETLIB_UPDATE(wav)
{
fprintf(m_file, "%e %e\n", netlist().time().as_double(), INPANALOG(m_I));
fprintf(m_file, "%e %e\n", netlist().time().as_double(), m_I());
}
NETLIB_NAME(log)::~NETLIB_NAME(wav)()

View File

@ -78,7 +78,7 @@ namespace netlist
NETLIB_UPDATE(MM5837_dip)
{
OUTLOGIC(m_Q, !m_Q.net().new_Q(), m_inc );
m_Q.push(!m_Q.net().new_Q(), m_inc);
/* shift register
*
@ -94,7 +94,7 @@ namespace netlist
if (state != last_state)
{
const nl_double R = state ? R_HIGH : R_LOW;
const nl_double V = state ? INPANALOG(m_VDD) : INPANALOG(m_VSS);
const nl_double V = state ? m_VDD() : m_VSS();
// We only need to update the net first if this is a time stepping net
if (m_is_timestep)

View File

@ -80,7 +80,7 @@ namespace netlist
inline nl_double NETLIB_NAME(NE555)::clamp(const nl_double v, const nl_double a, const nl_double b)
{
nl_double ret = v;
nl_double vcc = TERMANALOG(m_R1.m_P);
nl_double vcc = m_R1.m_P();
if (ret > vcc - a)
ret = vcc - a;
@ -108,9 +108,9 @@ namespace netlist
{
// FIXME: assumes GND is connected to 0V.
nl_double vt = clamp(TERMANALOG(m_R2.m_P), 0.7, 1.4);
bool bthresh = (INPANALOG(m_THRES) > vt);
bool btrig = (INPANALOG(m_TRIG) > clamp(TERMANALOG(m_R2.m_N), 0.7, 1.4));
nl_double vt = clamp(m_R2.m_P(), 0.7, 1.4);
bool bthresh = (m_THRES() > vt);
bool btrig = (m_TRIG() > clamp(m_R2.m_N(), 0.7, 1.4));
if (!btrig)
{
@ -121,19 +121,19 @@ namespace netlist
m_ff = false;
}
bool out = (!INPLOGIC(m_RESET) ? false : m_ff);
bool out = (!m_RESET() ? false : m_ff);
if (m_last_out && !out)
{
m_RDIS.update_dev();
OUTANALOG(m_OUT, TERMANALOG(m_R3.m_N));
m_OUT.push(m_R3.m_N());
m_RDIS.set_R(R_ON);
}
else if (!m_last_out && out)
{
m_RDIS.update_dev();
// FIXME: Should be delayed by 100ns
OUTANALOG(m_OUT, TERMANALOG(m_R1.m_P));
m_OUT.push(m_R1.m_P());
m_RDIS.set_R(R_OFF);
}
m_last_out = out;

View File

@ -40,9 +40,10 @@ namespace netlist
{
update_dev();
nl_double V = m_VIN.Value() / (nl_double) (1 << m_num.Value()) * (nl_double) m_val.Value();
double V = m_VIN() / static_cast<double>(1 << m_num())
* static_cast<double>(m_val());
this->set(1.0 / m_R.Value(), V, 0.0);
this->set(1.0 / m_R(), V, 0.0);
}
NETLIB_DEVICE_IMPL(r2r_dac)

View File

@ -24,12 +24,12 @@ namespace netlist
NETLIB_UPDATE_PARAM(clock)
{
m_inc = netlist_time::from_hz(m_freq.Value()*2);
m_inc = netlist_time::from_double(1.0 / (m_freq() * 2.0));
}
NETLIB_UPDATE(clock)
{
OUTLOGIC(m_Q, !INPLOGIC(m_feedback), m_inc );
m_Q.push(!m_feedback(), m_inc);
}
// ----------------------------------------------------------------------------------------
@ -39,13 +39,13 @@ namespace netlist
NETLIB_RESET(extclock)
{
m_cnt = 0;
m_off = netlist_time::from_double(m_offset.Value());
m_off = netlist_time::from_double(m_offset());
//m_Q.initial(0);
}
NETLIB_UPDATE(extclock)
{
OUTLOGIC(m_Q, (m_cnt & 1) ^ 1, m_inc[m_cnt] + m_off);
m_Q.push((m_cnt & 1) ^ 1, m_inc[m_cnt] + m_off);
m_cnt = (m_cnt + 1) % m_size;
m_off = netlist_time::zero();
}
@ -61,7 +61,7 @@ namespace netlist
NETLIB_UPDATE(logic_input)
{
OUTLOGIC(m_Q, m_IN.Value() & 1, netlist_time::from_nsec(1));
m_Q.push(m_IN() & 1, netlist_time::from_nsec(1));
}
NETLIB_UPDATE_PARAM(logic_input)
@ -79,7 +79,7 @@ namespace netlist
NETLIB_UPDATE(analog_input)
{
OUTANALOG(m_Q, m_IN.Value());
m_Q.push(m_IN());
}
NETLIB_UPDATE_PARAM(analog_input)
@ -101,7 +101,7 @@ namespace netlist
NETLIB_UPDATE(d_to_a_proxy)
{
const int state = INPLOGIC(m_I);
const int state = static_cast<int>(m_I());
if (state != m_last_state)
{
m_last_state = state;
@ -126,11 +126,11 @@ namespace netlist
NETLIB_UPDATE(res_sw)
{
const int state = INPLOGIC(m_I);
const netlist_sig_t state = m_I();
if (state != m_last_state)
{
m_last_state = state;
const nl_double R = state ? m_RON.Value() : m_ROFF.Value();
const nl_double R = state ? m_RON() : m_ROFF();
// We only need to update the net first if this is a time stepping net
if ((0)) // m_R->m_P.net().as_analog().solver()->is_timestep())
@ -163,8 +163,8 @@ namespace netlist
//OUTANALOG(m_Q, val);
nl_double stack[20];
unsigned ptr = 0;
unsigned e = m_precompiled.size();
for (unsigned i = 0; i<e; i++)
std::size_t e = m_precompiled.size();
for (std::size_t i = 0; i<e; i++)
{
rpn_inst &rc = m_precompiled[i];
switch (rc.m_cmd)
@ -186,14 +186,14 @@ namespace netlist
stack[ptr-1] = stack[ptr-1] / stack[ptr];
break;
case PUSH_INPUT:
stack[ptr++] = INPANALOG((*m_I[(int) rc.m_param]));
stack[ptr++] = (*m_I[static_cast<unsigned>(rc.m_param)])();
break;
case PUSH_CONST:
stack[ptr++] = rc.m_param;
break;
}
}
OUTANALOG(m_Q, stack[ptr-1]);
m_Q.push(stack[ptr-1]);
}

View File

@ -32,11 +32,11 @@ namespace netlist
typename nld_truthtable_t<m_NI, m_NO>::truthtable_t m_ttbl;
};
static const uint_least64_t all_set = ~((uint_least64_t) 0);
static const uint_least64_t all_set = ~(static_cast<uint_least64_t>(0));
unsigned truthtable_desc_t::count_bits(uint_least64_t v)
{
uint_least64_t ret = 0;
unsigned ret = 0;
for (; v != 0; v = v >> 1)
{
ret += (v & 1);
@ -124,8 +124,8 @@ void truthtable_desc_t::help(unsigned cur, plib::pstring_vector_t list,
uint_least64_t state, uint_least64_t val, std::vector<uint_least8_t> &timing_index)
{
pstring elem = list[cur].trim();
int start = 0;
int end = 0;
uint_least64_t start = 0;
uint_least64_t end = 0;
if (elem.equals("0"))
{
@ -144,7 +144,7 @@ void truthtable_desc_t::help(unsigned cur, plib::pstring_vector_t list,
}
else
nl_assert_always(false, "unknown input value (not 0, 1, or X)");
for (int i = start; i <= end; i++)
for (uint_least64_t i = start; i <= end; i++)
{
const uint_least64_t nstate = state | (i << cur);
@ -205,8 +205,8 @@ void truthtable_desc_t::setup(const plib::pstring_vector_t &truthtable, uint_lea
val = val | (1 << j);
else
nl_assert_always(outs.equals("0"), "Unknown value (not 0 or 1");
netlist_time t = netlist_time::from_nsec(times[j].trim().as_long());
int k=0;
netlist_time t = netlist_time::from_nsec(static_cast<unsigned long>(times[j].trim().as_long()));
uint_least8_t k=0;
while (m_timing_nt[k] != netlist_time::zero() && m_timing_nt[k] != t)
k++;
m_timing_nt[k] = t;
@ -228,7 +228,7 @@ void truthtable_desc_t::setup(const plib::pstring_vector_t &truthtable, uint_lea
{
if (ign[i] == all_set)
{
int tign;
uint_least64_t tign;
if ((0))
{
tign = get_ignored_simple(i);

View File

@ -63,10 +63,10 @@ namespace netlist
{
switch (m_size)
{
case 1: ((uint_least8_t *) m_data)[pos] = val; break;
case 2: ((uint_least16_t *) m_data)[pos] = val; break;
case 4: ((uint_least32_t *) m_data)[pos] = val; break;
case 8: ((uint_least64_t *) m_data)[pos] = val; break;
case 1: static_cast<uint_least8_t *>(m_data)[pos] = static_cast<uint_least8_t>(val); break;
case 2: static_cast<uint_least16_t *>(m_data)[pos] = static_cast<uint_least16_t>(val); break;
case 4: static_cast<uint_least32_t *>(m_data)[pos] = static_cast<uint_least32_t>(val); break;
case 8: static_cast<uint_least64_t *>(m_data)[pos] = static_cast<uint_least64_t>(val); break;
default: { }
}
}
@ -75,10 +75,10 @@ namespace netlist
{
switch (m_size)
{
case 1: return ((uint_least8_t *) m_data)[pos]; break;
case 2: return ((uint_least16_t *) m_data)[pos]; break;
case 4: return ((uint_least32_t *) m_data)[pos]; break;
case 8: return ((uint_least64_t *) m_data)[pos]; break;
case 1: return static_cast<uint_least8_t *>(m_data)[pos]; break;
case 2: return static_cast<uint_least16_t *>(m_data)[pos]; break;
case 4: return static_cast<uint_least32_t *>(m_data)[pos]; break;
case 8: return static_cast<uint_least64_t *>(m_data)[pos]; break;
default:
return 0; //should never happen
}
@ -88,10 +88,10 @@ namespace netlist
{
switch (m_size)
{
case 1: return ((uint_least8_t) val); break;
case 2: return ((uint_least16_t) val); break;
case 4: return ((uint_least32_t) val); break;
case 8: return ((uint_least64_t) val); break;
case 1: return static_cast<uint_least8_t >(val); break;
case 2: return static_cast<uint_least16_t>(val); break;
case 4: return static_cast<uint_least32_t>(val); break;
case 8: return static_cast<uint_least64_t>(val); break;
default:
return 0; //should never happen
}
@ -103,7 +103,7 @@ namespace netlist
struct truthtable_desc_t
{
truthtable_desc_t(int NO, int NI, bool *initialized,
truthtable_desc_t(unsigned NO, unsigned NI, bool *initialized,
packed_int outs, uint_least8_t *timing, netlist_time *timing_nt)
: m_NO(NO), m_NI(NI), m_initialized(initialized),
m_outs(outs), m_timing(timing), m_timing_nt(timing_nt),
@ -140,7 +140,7 @@ namespace netlist
NETLIB_OBJECT(truthtable_t)
{
private:
family_setter_t m_fam;
detail::family_setter_t m_fam;
public:
static constexpr int m_num_bits = m_NI;
@ -217,8 +217,8 @@ namespace netlist
for (std::size_t i=0; i < m_NO; i++)
{
pstring tmp = "_" + out[i];
const int idx = plib::container::indexof(inout, tmp);
if (idx>=0)
const std::size_t idx = plib::container::indexof(inout, tmp);
if (idx != plib::container::npos)
{
connect_late(m_Q[i], m_I[idx]);
// disable ignore for this inputs altogether.
@ -309,7 +309,7 @@ namespace netlist
for (std::size_t i = 0; i < m_NI; i++)
{
m_I[i].activate();
state |= (INPLOGIC(m_I[i]) << i);
state |= (m_I[i]() << i);
mt = std::max(this->m_I[i].net().time(), mt);
}
else
@ -317,7 +317,7 @@ namespace netlist
{
if ((ign & 1))
m_I[i].activate();
state |= (INPLOGIC(m_I[i]) << i);
state |= (m_I[i]() << i);
}
}
else
@ -325,12 +325,12 @@ namespace netlist
if (!doOUT)
for (std::size_t i = 0; i < m_NI; i++)
{
state |= (INPLOGIC(m_I[i]) << i);
state |= (m_I[i]() << i);
mt = std::max(this->m_I[i].net().time(), mt);
}
else
for (std::size_t i = 0; i < m_NI; i++)
state |= (INPLOGIC(m_I[i]) << i);
state |= (m_I[i]() << i);
}
auto nstate = state;
@ -344,7 +344,7 @@ namespace netlist
if (doOUT)
{
for (std::size_t i = 0; i < m_NO; i++)
OUTLOGIC(m_Q[i], (out >> i) & 1, m_ttp->m_timing_nt[m_ttp->m_timing[timebase + i]]);
m_Q[i].push((out >> i) & 1, m_ttp->m_timing_nt[m_ttp->m_timing[timebase + i]]);
}
else
for (std::size_t i = 0; i < m_NO; i++)

View File

@ -26,8 +26,8 @@ namespace netlist
NETLIB_RESETI() {}
public:
inline nl_double vdd() { return INPANALOG(m_vdd); }
inline nl_double vss() { return INPANALOG(m_vss); }
nl_double vdd() { return m_vdd(); }
nl_double vss() { return m_vss(); }
analog_input_t m_vdd;
analog_input_t m_vss;

View File

@ -49,7 +49,7 @@ namespace netlist
, m_Q(*this, "Q")
, m_freq(*this, "FREQ", 7159000.0 * 5)
{
m_inc = netlist_time::from_hz(m_freq.Value()*2);
m_inc = netlist_time::from_double(1.0 / (m_freq()*2.0));
}
NETLIB_RESETI()
@ -59,7 +59,7 @@ namespace netlist
NETLIB_UPDATE_PARAMI()
{
m_inc = netlist_time::from_hz(m_freq.Value()*2);
m_inc = netlist_time::from_double(1.0 / (m_freq()*2.0));
}
NETLIB_UPDATEI()
@ -90,7 +90,7 @@ namespace netlist
, m_Q(*this, "Q")
, m_freq(*this, "FREQ", 7159000.0 * 5.0)
{
m_inc = netlist_time::from_hz(m_freq.Value()*2);
m_inc = netlist_time::from_double(1.0 / (m_freq()*2.0));
connect_late(m_feedback, m_Q);
}
@ -121,20 +121,20 @@ namespace netlist
, m_cnt(*this, "m_cnt", 0)
, m_off(*this, "m_off", netlist_time::zero())
{
m_inc[0] = netlist_time::from_hz(m_freq.Value()*2);
m_inc[0] = netlist_time::from_double(1.0 / (m_freq()*2.0));
connect_late(m_feedback, m_Q);
{
netlist_time base = netlist_time::from_hz(m_freq.Value()*2);
plib::pstring_vector_t pat(m_pattern.Value(),",");
m_off = netlist_time::from_double(m_offset.Value());
netlist_time base = netlist_time::from_double(1.0 / (m_freq()*2.0));
plib::pstring_vector_t pat(m_pattern(),",");
m_off = netlist_time::from_double(m_offset());
int pati[256];
unsigned long pati[256];
m_size = pat.size();
int total = 0;
unsigned long total = 0;
for (unsigned i=0; i<m_size; i++)
{
pati[i] = pat[i].as_long();
pati[i] = static_cast<unsigned long>(pat[i].as_long());
total += pati[i];
}
netlist_time ttotal = netlist_time::zero();
@ -160,7 +160,7 @@ namespace netlist
netlist_time m_inc[32];
state_var<unsigned> m_cnt;
state_var<netlist_time> m_off;
unsigned m_size;
std::size_t m_size;
};
// -----------------------------------------------------------------------------
@ -175,7 +175,7 @@ namespace netlist
/* make sure we get the family first */
, m_FAMILY(*this, "FAMILY", "FAMILY(TYPE=TTL)")
{
set_logic_family(netlist().setup().family_from_model(m_FAMILY.Value()));
set_logic_family(netlist().setup().family_from_model(m_FAMILY()));
}
NETLIB_UPDATE_AFTER_PARAM_CHANGE()
@ -220,7 +220,7 @@ namespace netlist
}
NETLIB_UPDATEI()
{
OUTANALOG(m_Q, 0.0);
m_Q.push(0.0);
}
NETLIB_RESETI() { }
protected:
@ -276,13 +276,13 @@ namespace netlist
NETLIB_RESETI()
{
m_RIN.set(1.0 / m_p_RIN.Value(),0,0);
m_ROUT.set(1.0 / m_p_ROUT.Value(),0,0);
m_RIN.set(1.0 / m_p_RIN(),0,0);
m_ROUT.set(1.0 / m_p_ROUT(),0,0);
}
NETLIB_UPDATEI()
{
OUTANALOG(m_Q, INPANALOG(m_I));
m_Q.push(m_I());
}
private:
@ -309,10 +309,10 @@ namespace netlist
, m_func(*this, "FUNC", "")
, m_Q(*this, "Q")
{
for (int i=0; i < m_N; i++)
for (int i=0; i < m_N(); i++)
m_I.push_back(plib::make_unique<analog_input_t>(*this, plib::pfmt("A{1}")(i)));
plib::pstring_vector_t cmds(m_func.Value(), " ");
plib::pstring_vector_t cmds(m_func(), " ");
m_precompiled.clear();
for (std::size_t i=0; i < cmds.size(); i++)
@ -338,7 +338,7 @@ namespace netlist
rc.m_cmd = PUSH_CONST;
rc.m_param = cmd.as_double(&err);
if (err)
netlist().log().fatal("nld_function: unknown/misformatted token <{1}> in <{2}>", cmd, m_func.Value());
netlist().log().fatal("nld_function: unknown/misformatted token <{1}> in <{2}>", cmd, m_func());
}
m_precompiled.push_back(rc);
}
@ -404,13 +404,13 @@ namespace netlist
NETLIB_RESETI()
{
m_last_state = 0;
m_R.set_R(m_ROFF.Value());
m_R.set_R(m_ROFF());
}
//NETLIB_UPDATE_PARAMI();
NETLIB_UPDATEI();
private:
state_var_u8 m_last_state;
state_var<netlist_sig_t> m_last_state;
};
// -----------------------------------------------------------------------------
@ -420,7 +420,8 @@ namespace netlist
NETLIB_OBJECT(base_proxy)
{
public:
nld_base_proxy(netlist_t &anetlist, const pstring &name, logic_t *inout_proxied, core_terminal_t *proxy_inout)
nld_base_proxy(netlist_t &anetlist, const pstring &name,
logic_t *inout_proxied, detail::core_terminal_t *proxy_inout)
: device_t(anetlist, name)
{
m_logic_family = inout_proxied->logic_family();
@ -431,7 +432,7 @@ namespace netlist
virtual ~nld_base_proxy() {}
logic_t &term_proxied() const { return *m_term_proxied; }
core_terminal_t &proxy_term() const { return *m_proxy_term; }
detail::core_terminal_t &proxy_term() const { return *m_proxy_term; }
protected:
@ -443,7 +444,7 @@ namespace netlist
private:
const logic_family_desc_t *m_logic_family;
logic_t *m_term_proxied;
core_terminal_t *m_proxy_term;
detail::core_terminal_t *m_proxy_term;
};
// -----------------------------------------------------------------------------
@ -472,9 +473,9 @@ namespace netlist
NETLIB_UPDATEI()
{
if (m_I.Q_Analog() > logic_family().m_high_thresh_V)
OUTLOGIC(m_Q, 1, NLTIME_FROM_NS(1));
m_Q.push(1, NLTIME_FROM_NS(1));
else if (m_I.Q_Analog() < logic_family().m_low_thresh_V)
OUTLOGIC(m_Q, 0, NLTIME_FROM_NS(1));
m_Q.push(0, NLTIME_FROM_NS(1));
else
{
// do nothing
@ -495,7 +496,8 @@ namespace netlist
virtual logic_input_t &in() { return m_I; }
protected:
nld_base_d_to_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *out_proxied, core_terminal_t &proxy_out)
nld_base_d_to_a_proxy(netlist_t &anetlist, const pstring &name,
logic_output_t *out_proxied, detail::core_terminal_t &proxy_out)
: nld_base_proxy(anetlist, name, out_proxied, &proxy_out)
, m_I(*this, "I")
{

View File

@ -0,0 +1,14 @@
img[alt*="-50r."]
{
width: 30%;
display: block;
float: right;
}
.fragment
{
clear: both;
}
.footer
{
clear: both;
}

View File

@ -0,0 +1,165 @@
/*! \mainpage notitle
##Netlist
###A mixed signal circuit simulation.
- D: Device
- O: Rail output (output)
- I: Infinite impedance input (input)
- T: Terminal (finite impedance)
The following example shows a typical connection between several devices:
+---+ +---+ +---+ +---+ +---+
| | | | | | | | | |
| D | | D | | D | | D | | D |
| | | | | | | | | |
+-O-+ +-I-+ +-I-+ +-T-+ +-T-+
| | | | |
+-+---------+---------+---------+---------+-+
| rail net |
+-------------------------------------------+
A rail net is a net which is driven by exactly one output with an
(idealized) internal resistance of zero.
Ideally, it can deliver infinite current.
A infinite resistance input does not source or sink current.
Terminals source or sink finite (but never zero) current.
The system differentiates between analog and logic input and outputs and
analog terminals. Analog and logic devices can not be connected to the
same net. Instead, proxy devices are inserted automatically:
+---+ +---+
| | | |
| D1| | D2|
| A | | L |
+-O-+ +-I-+
| |
+-+---------+---+
| rail net |
+---------------+
is converted into
+----------+
| |
+---+ +-+-+ | +---+
| | | L | A-L | | |
| D1| | D | Proxy | | D2|
| A | | A | | | |
+-O-+ +-I-+ | +-I-+
| | | |
+-+---------+--+ +-+-----+-------+
| rail net (A) | | rail net (L) |
+--------------| +---------------+
This works both analog to logic as well as logic to analog.
The above is an advanced implementation of the existing discrete
subsystem in MAME. Instead of relying on a fixed time-step, analog devices
could either connect to fixed time-step clock or use an internal clock
to update them. This would however introduce macro devices for RC, diodes
and transistors again.
Instead, the following approach in case of a pure terminal/input network
is taken:
+---+ +---+ +---+ +---+ +---+
| | | | | | | | | |
| D | | D | | D | | D | | D |
| | | | | | | | | |
+-T-+ +-I-+ +-I-+ +-T-+ +-T-+
| | | | |
'+' | | '-' '-'
+-+---------+---------+---------+---------+-+
| Calculated net |
+-------------------------------------------+
Netlist uses the following basic two terminal device:
(k)
+-----T-----+
| | |
| +--+--+ |
| | | |
| R | |
| R | |
| R I |
| | I | Device n
| V+ I |
| V | |
| V- | |
| | | |
| +--+--+ |
| | |
+-----T-----+
(l)
This is a resistance in series to a voltage source and paralleled by a
current source. This is suitable to model voltage sources, current sources,
resistors, capacitors, inductances and diodes.
\f[
I_{n,l} = - I_{n,k} = ( V_k - V^N - V_l ) \frac{1}{R^n} + I^n
\f]
Now, the sum of all currents for a given net must be 0:
\f[
\sum_n I_{n,l} = 0 = \sum_{n,k} (V_k - V^n - V_l ) \frac{1}{R^n} + I^n
\f]
With \f$ G^n = \frac{1}{R^n} \f$ and \f$ \sum_n G^n = G^{tot} \f$ and \f$k=k(n)\f$
\f[
0 = - V_l G^{tot} + \sum_n (V_{k(n)} - V^n) G^n + I^n)
\f]
and with \f$ l=l(n)\f$ and fixed \f$ k\f$
\f[
0 = -V_k G^{tot} + sum_n( V_{l(n)} + V^n ) G^n - I^n)
\f]
These equations represent a linear Matrix equation (with more math).
In the end the solution of the analog subsystem boils down to
\f[
\mathbf{\it{(G - D) v = i}}
\f]
with G being the conductance matrix, D a diagonal matrix with the total
conductance on the diagonal elements, V the net voltage vector and I the
current vector.
By using solely two terminal devices, we can simplify the whole calculation
significantly. A BJT now is a four terminal device with two terminals being
connected internally.
The system is solved using an iterative approach:
G V - D V = I
assuming V=Vn=Vo
Vn = D-1 (I - G Vo)
Each terminal thus has three properties:
a) Resistance
b) Voltage source
c) Current source/sink
Going forward, the approach can be extended e.g. to use a linear
equation solver.
The formal representation of the circuit will stay the same, thus scales.
*/

View File

@ -0,0 +1,62 @@
/*! \page primer_1 nltool primer
## First example
Let's start with a simple charge/discharge circuit. I denotes the input,
O denotes the output.
I >----RRR----+-----> O
|
C
C
C
|
GND
Now in netlist syntax this looks like:
~~~{.cpp}
NETLIST_START(charge_discharge)
SOLVER(solver, 48000) // Fixed frequency solver
CLOCK(I, 200) // 200 Hz clock as input, TTL logic output
RES(R, RES_K(1))
CAP(C, CAP_U(1))
NET_C(I.Q, R.1)
NET_C(R.2, C.1)
NET_C(C.2, GND)
ALIAS(O, R.2) // Output O == C.1 == R.2
NETLIST_END()
~~~
Save this example as e.g. test1.cpp. Now that's a c++ extension. The background
is simple. You can also compile netlists. Thats a feature which is used by MAME.
That's something we will cover later.
Now, to test this, run the following:
~~~
> nltool --cmd=run -f test1.cpp -t 0.05 -l O -l I
~~~
This will run the circuit for 50 ms and log input "I" to file log_I.log and
output "O" to log_O.log . The log files will be located in the current folder.
Next, run
~~~
> plot_nl I O
~~~
![](test1-50r.svg)
and enjoy the results.
##Recap
We have created our first netlist fragment. nltool was used to model the
periodically forced charge/discharge circuit for 50ms. Finally we plotted both input
and output voltages using the plot_nl command using the log files we generated.
*/

View File

@ -0,0 +1,21 @@
/*! The netlist namespace.
* All netlist related code is contained in the netlist namespace
*/
namespace netlist
{
/*! The netlist::devices namespace.
* All netlist devices are contained in the netlist::devices namespace.
*/
namespace devices
{
}
/*! Internal support classes you should not use in code using netlist api.
* This namespace contains all internal support classes not intended
* to be used outside of the core.
*/
namespace detail
{
}
}

View File

@ -0,0 +1,720 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg
width="600" height="480"
viewBox="0 0 600 480"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
>
<title>Gnuplot</title>
<desc>Produced by GNUPLOT 4.6 patchlevel 6 </desc>
<g id="gnuplot_canvas">
<rect x="0" y="0" width="600" height="480" fill="none"/>
<defs>
<circle id='gpDot' r='0.5' stroke-width='0.5'/>
<path id='gpPt0' stroke-width='0.222' stroke='currentColor' d='M-1,0 h2 M0,-1 v2'/>
<path id='gpPt1' stroke-width='0.222' stroke='currentColor' d='M-1,-1 L1,1 M1,-1 L-1,1'/>
<path id='gpPt2' stroke-width='0.222' stroke='currentColor' d='M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1'/>
<rect id='gpPt3' stroke-width='0.222' stroke='currentColor' x='-1' y='-1' width='2' height='2'/>
<rect id='gpPt4' stroke-width='0.222' stroke='currentColor' fill='currentColor' x='-1' y='-1' width='2' height='2'/>
<circle id='gpPt5' stroke-width='0.222' stroke='currentColor' cx='0' cy='0' r='1'/>
<use xlink:href='#gpPt5' id='gpPt6' fill='currentColor' stroke='none'/>
<path id='gpPt7' stroke-width='0.222' stroke='currentColor' d='M0,-1.33 L-1.33,0.67 L1.33,0.67 z'/>
<use xlink:href='#gpPt7' id='gpPt8' fill='currentColor' stroke='none'/>
<use xlink:href='#gpPt7' id='gpPt9' stroke='currentColor' transform='rotate(180)'/>
<use xlink:href='#gpPt9' id='gpPt10' fill='currentColor' stroke='none'/>
<use xlink:href='#gpPt3' id='gpPt11' stroke='currentColor' transform='rotate(45)'/>
<use xlink:href='#gpPt11' id='gpPt12' fill='currentColor' stroke='none'/>
<filter id='greybox' filterUnits='objectBoundingBox' x='0' y='0' height='1' width='1'>
<feFlood flood-color='lightgrey' flood-opacity='1' result='grey'/>
<feComposite in='SourceGraphic' in2='grey' operator='atop'/>
</filter>
</defs>
<g style="fill:none; color:white; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
</g>
<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
<path stroke='black' d='M53.9,444.0 L62.9,444.0 M575.0,444.0 L566.0,444.0 '/> <g transform="translate(45.6,448.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
<text> 0</text>
</g>
<path stroke='black' d='M53.9,390.6 L62.9,390.6 M575.0,390.6 L566.0,390.6 '/> <g transform="translate(45.6,395.1)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
<text> 0.5</text>
</g>
<path stroke='black' d='M53.9,337.2 L62.9,337.2 M575.0,337.2 L566.0,337.2 '/> <g transform="translate(45.6,341.7)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
<text> 1</text>
</g>
<path stroke='black' d='M53.9,283.8 L62.9,283.8 M575.0,283.8 L566.0,283.8 '/> <g transform="translate(45.6,288.3)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
<text> 1.5</text>
</g>
<path stroke='black' d='M53.9,230.3 L62.9,230.3 M575.0,230.3 L566.0,230.3 '/> <g transform="translate(45.6,234.8)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
<text> 2</text>
</g>
<path stroke='black' d='M53.9,176.9 L62.9,176.9 M575.0,176.9 L566.0,176.9 '/> <g transform="translate(45.6,181.4)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
<text> 2.5</text>
</g>
<path stroke='black' d='M53.9,123.5 L62.9,123.5 M575.0,123.5 L566.0,123.5 '/> <g transform="translate(45.6,128.0)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
<text> 3</text>
</g>
<path stroke='black' d='M53.9,70.1 L62.9,70.1 M575.0,70.1 L566.0,70.1 '/> <g transform="translate(45.6,74.6)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
<text> 3.5</text>
</g>
<path stroke='black' d='M53.9,16.7 L62.9,16.7 M575.0,16.7 L566.0,16.7 '/> <g transform="translate(45.6,21.2)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
<text> 4</text>
</g>
<path stroke='black' d='M53.9,444.0 L53.9,435.0 M53.9,16.7 L53.9,25.7 '/> <g transform="translate(53.9,466.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
<text>0 </text>
</g>
<path stroke='black' d='M106.0,444.0 L106.0,435.0 M106.0,16.7 L106.0,25.7 '/> <g transform="translate(106.0,466.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
<text>5m</text>
</g>
<path stroke='black' d='M158.1,444.0 L158.1,435.0 M158.1,16.7 L158.1,25.7 '/> <g transform="translate(158.1,466.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
<text>10m</text>
</g>
<path stroke='black' d='M210.2,444.0 L210.2,435.0 M210.2,16.7 L210.2,25.7 '/> <g transform="translate(210.2,466.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
<text>15m</text>
</g>
<path stroke='black' d='M262.3,444.0 L262.3,435.0 M262.3,16.7 L262.3,25.7 '/> <g transform="translate(262.3,466.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
<text>20m</text>
</g>
<path stroke='black' d='M314.5,444.0 L314.5,435.0 M314.5,16.7 L314.5,25.7 '/> <g transform="translate(314.5,466.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
<text>25m</text>
</g>
<path stroke='black' d='M366.6,444.0 L366.6,435.0 M366.6,16.7 L366.6,25.7 '/> <g transform="translate(366.6,466.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
<text>30m</text>
</g>
<path stroke='black' d='M418.7,444.0 L418.7,435.0 M418.7,16.7 L418.7,25.7 '/> <g transform="translate(418.7,466.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
<text>35m</text>
</g>
<path stroke='black' d='M470.8,444.0 L470.8,435.0 M470.8,16.7 L470.8,25.7 '/> <g transform="translate(470.8,466.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
<text>40m</text>
</g>
<path stroke='black' d='M522.9,444.0 L522.9,435.0 M522.9,16.7 L522.9,25.7 '/> <g transform="translate(522.9,466.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
<text>45m</text>
</g>
<path stroke='black' d='M575.0,444.0 L575.0,435.0 M575.0,16.7 L575.0,25.7 '/> <g transform="translate(575.0,466.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
<text>50m</text>
</g>
<path stroke='black' d='M53.9,16.7 L53.9,444.0 L575.0,444.0 L575.0,16.7 L53.9,16.7 Z '/></g>
<g id="gnuplot_plot_1" ><title>gnuplot_plot_1</title>
<g style="fill:none; color:red; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
<g transform="translate(507.9,39.2)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
<text>O</text>
</g>
<path d='M516.2,34.7 L558.4,34.7 M53.9,444.0 L54.1,444.0 L54.1,443.8 L54.3,443.8 L54.3,443.6 L54.6,443.6
L54.6,443.4 L54.8,443.4 L54.8,443.2 L55.0,443.2 L55.0,443.0 L55.2,443.0 L55.2,442.8 L55.4,442.8
L55.4,442.6 L55.6,442.6 L55.6,442.4 L55.9,442.4 L55.9,442.2 L56.1,442.2 L56.1,442.0 L56.3,442.0
L56.3,441.8 L56.5,441.8 L56.5,441.7 L56.7,441.7 L56.7,441.5 L56.9,441.5 L56.9,441.3 L57.2,441.3
L57.2,441.2 L57.4,441.2 L57.4,441.0 L57.6,441.0 L57.6,440.8 L57.8,440.8 L57.8,440.7 L58.0,440.7
L58.0,440.5 L58.2,440.5 L58.2,440.4 L58.5,440.4 L58.5,440.2 L58.7,440.2 L58.7,440.1 L58.9,440.1
L58.9,440.0 L59.1,440.0 L59.1,439.8 L59.3,439.8 L59.3,439.7 L59.5,439.7 L59.5,439.6 L59.8,439.6
L59.8,439.4 L60.0,439.4 L60.0,439.3 L60.2,439.3 L60.2,439.2 L60.4,439.2 L60.4,439.1 L60.6,439.1
L60.6,439.0 L60.8,439.0 L60.8,438.8 L61.1,438.8 L61.1,438.7 L61.3,438.7 L61.3,438.6 L61.5,438.6
L61.5,438.5 L61.7,438.5 L61.7,438.4 L61.9,438.4 L61.9,438.3 L62.2,438.3 L62.2,438.2 L62.4,438.2
L62.4,438.1 L62.6,438.1 L62.6,438.0 L62.8,438.0 L62.8,437.9 L63.0,437.9 L63.0,437.8 L63.2,437.8
L63.2,437.7 L63.5,437.7 L63.5,437.6 L63.7,437.6 L63.7,437.5 L63.9,437.5 L64.1,437.5 L64.1,437.4
L64.3,437.4 L64.3,437.3 L64.5,437.3 L64.5,437.2 L64.8,437.2 L64.8,437.1 L65.0,437.1 L65.2,437.1
L65.2,437.0 L65.4,437.0 L65.4,436.9 L65.6,436.9 L65.6,436.8 L65.8,436.8 L66.1,436.8 L66.1,436.7
L66.3,436.7 L66.3,436.6 L66.5,436.6 L66.7,436.6 L66.7,436.5 L66.9,436.5 L66.9,436.4 L67.1,436.4
L67.4,436.4 L67.4,436.3 L67.6,436.3 L67.6,436.2 L67.8,436.2 L68.0,436.2 L68.0,436.1 L68.2,436.1
L68.4,436.1 L68.4,436.0 L68.7,436.0 L68.7,435.9 L68.9,435.9 L69.1,435.9 L69.1,435.8 L69.3,435.8
L69.5,435.8 L69.5,435.7 L69.7,435.7 L70.0,435.7 L70.0,435.6 L70.2,435.6 L70.4,435.6 L70.4,435.5
L70.6,435.5 L70.8,435.5 L71.1,435.5 L71.1,435.4 L71.3,435.4 L71.5,435.4 L71.5,435.3 L71.7,435.3
L71.9,435.3 L72.1,435.3 L72.1,435.2 L72.4,435.2 L72.6,435.2 L72.6,435.1 L72.8,435.1 L73.0,435.1
L73.2,435.1 L73.2,435.0 L73.4,435.0 L73.7,435.0 L73.9,435.0 L73.9,434.9 L74.1,434.9 L74.3,434.9
L74.5,434.9 L74.5,434.8 L74.7,434.8 L75.0,434.8 L75.2,434.8 L75.2,434.7 L75.4,434.7 L75.6,434.7
L75.8,434.7 L76.0,434.7 L76.0,434.6 L76.3,434.6 L76.5,434.6 L76.7,434.6 L76.7,434.5 L76.9,434.5
L77.1,434.5 L77.3,434.5 L77.6,434.5 L77.6,434.4 L77.8,434.4 L78.0,434.4 L78.2,434.4 L78.4,434.4
L78.7,434.4 L78.7,434.3 L78.9,434.3 L79.1,434.3 L79.3,434.3 L79.5,434.3 L79.7,434.3 L79.7,434.2
L80.0,434.2 L80.2,434.2 L80.2,426.7 L80.4,426.7 L80.4,419.3 L80.6,419.3 L80.6,412.0 L80.8,412.0
L80.8,404.8 L81.0,404.8 L81.0,397.8 L81.3,397.8 L81.3,390.9 L81.5,390.9 L81.5,384.1 L81.7,384.1
L81.7,377.5 L81.9,377.5 L81.9,370.9 L82.1,370.9 L82.1,364.5 L82.3,364.5 L82.3,358.2 L82.6,358.2
L82.6,352.0 L82.8,352.0 L82.8,346.0 L83.0,346.0 L83.0,340.0 L83.2,340.0 L83.2,334.2 L83.4,334.2
L83.4,328.4 L83.6,328.4 L83.6,322.8 L83.9,322.8 L83.9,317.2 L84.1,317.2 L84.1,311.8 L84.3,311.8
L84.3,306.4 L84.5,306.4 L84.5,301.2 L84.7,301.2 L84.7,296.0 L84.9,296.0 L84.9,291.0 L85.2,291.0
L85.2,286.0 L85.4,286.0 L85.4,281.2 L85.6,281.2 L85.6,276.4 L85.8,276.4 L85.8,271.7 L86.0,271.7
L86.0,267.0 L86.3,267.0 L86.3,262.5 L86.5,262.5 L86.5,258.1 L86.7,258.1 L86.7,253.7 L86.9,253.7
L86.9,249.4 L87.1,249.4 L87.1,245.2 L87.3,245.2 L87.3,241.1 L87.6,241.1 L87.6,237.0 L87.8,237.0
L87.8,233.0 L88.0,233.0 L88.0,229.1 L88.2,229.1 L88.2,225.2 L88.4,225.2 L88.4,221.5 L88.6,221.5
L88.6,217.8 L88.9,217.8 L88.9,214.1 L89.1,214.1 L89.1,210.6 L89.3,210.6 L89.3,207.0 L89.5,207.0
L89.5,203.6 L89.7,203.6 L89.7,200.2 L89.9,200.2 L89.9,196.9 L90.2,196.9 L90.2,193.6 L90.4,193.6
L90.4,190.4 L90.6,190.4 L90.6,187.3 L90.8,187.3 L90.8,184.2 L91.0,184.2 L91.0,181.2 L91.2,181.2
L91.2,178.2 L91.5,178.2 L91.5,175.3 L91.7,175.3 L91.7,172.4 L91.9,172.4 L91.9,169.6 L92.1,169.6
L92.1,166.8 L92.3,166.8 L92.3,164.1 L92.5,164.1 L92.5,161.4 L92.8,161.4 L92.8,158.8 L93.0,158.8
L93.0,156.2 L93.2,156.2 L93.2,153.7 L93.4,153.7 L93.4,151.2 L93.6,151.2 L93.6,148.8 L93.9,148.8
L93.9,146.4 L94.1,146.4 L94.1,144.0 L94.3,144.0 L94.3,141.7 L94.5,141.7 L94.5,139.5 L94.7,139.5
L94.7,137.3 L94.9,137.3 L94.9,135.1 L95.2,135.1 L95.2,132.9 L95.4,132.9 L95.4,130.8 L95.6,130.8
L95.6,128.8 L95.8,128.8 L95.8,126.7 L96.0,126.7 L96.0,124.7 L96.2,124.7 L96.2,122.8 L96.5,122.8
L96.5,120.9 L96.7,120.9 L96.7,119.0 L96.9,119.0 L96.9,117.1 L97.1,117.1 L97.1,115.3 L97.3,115.3
L97.3,113.5 L97.5,113.5 L97.5,111.8 L97.8,111.8 L97.8,110.1 L98.0,110.1 L98.0,108.4 L98.2,108.4
L98.2,106.7 L98.4,106.7 L98.4,105.1 L98.6,105.1 L98.6,103.5 L98.8,103.5 L98.8,101.9 L99.1,101.9
L99.1,100.4 L99.3,100.4 L99.3,98.8 L99.5,98.8 L99.5,97.4 L99.7,97.4 L99.7,95.9 L99.9,95.9
L99.9,94.5 L100.1,94.5 L100.1,93.1 L100.4,93.1 L100.4,91.7 L100.6,91.7 L100.6,90.3 L100.8,90.3
L100.8,89.0 L101.0,89.0 L101.0,87.7 L101.2,87.7 L101.2,86.4 L101.4,86.4 L101.4,85.1 L101.7,85.1
L101.7,83.9 L101.9,83.9 L101.9,82.7 L102.1,82.7 L102.1,81.5 L102.3,81.5 L102.3,80.3 L102.5,80.3
L102.5,79.2 L102.8,79.2 L102.8,78.0 L103.0,78.0 L103.0,76.9 L103.2,76.9 L103.2,75.8 L103.4,75.8
L103.4,74.8 L103.6,74.8 L103.6,73.7 L103.8,73.7 L103.8,72.7 L104.1,72.7 L104.1,71.7 L104.3,71.7
L104.3,70.7 L104.5,70.7 L104.5,69.7 L104.7,69.7 L104.7,68.7 L104.9,68.7 L104.9,67.8 L105.1,67.8
L105.1,66.9 L105.4,66.9 L105.4,66.0 L105.6,66.0 L105.6,65.1 L105.8,65.1 L105.8,64.2 L106.0,64.2
L106.0,63.3 L106.2,63.3 L106.2,70.8 L106.4,70.8 L106.4,78.2 L106.7,78.2 L106.7,85.5 L106.9,85.5
L106.9,92.6 L107.1,92.6 L107.1,99.5 L107.3,99.5 L107.3,106.3 L107.5,106.3 L107.5,113.0 L107.7,113.0
L107.7,119.5 L108.0,119.5 L108.0,125.9 L108.2,125.9 L108.2,132.2 L108.4,132.2 L108.4,138.3 L108.6,138.3
L108.6,144.3 L108.8,144.3 L108.8,150.2 L109.0,150.2 L109.0,156.0 L109.3,156.0 L109.3,161.6 L109.5,161.6
L109.5,167.2 L109.7,167.2 L109.7,172.6 L109.9,172.6 L109.9,177.9 L110.1,177.9 L110.1,183.1 L110.4,183.1
L110.4,188.2 L110.6,188.2 L110.6,193.2 L110.8,193.2 L110.8,198.1 L111.0,198.1 L111.0,202.9 L111.2,202.9
L111.2,207.6 L111.4,207.6 L111.4,212.2 L111.7,212.2 L111.7,216.7 L111.9,216.7 L111.9,221.1 L112.1,221.1
L112.1,225.5 L112.3,225.5 L112.3,229.7 L112.5,229.7 L112.5,233.9 L112.7,233.9 L112.7,237.9 L113.0,237.9
L113.0,241.9 L113.2,241.9 L113.2,245.8 L113.4,245.8 L113.4,249.6 L113.6,249.6 L113.6,253.4 L113.8,253.4
L113.8,257.0 L114.0,257.0 L114.0,260.6 L114.3,260.6 L114.3,264.2 L114.5,264.2 L114.5,267.6 L114.7,267.6
L114.7,271.0 L114.9,271.0 L114.9,274.3 L115.1,274.3 L115.1,277.5 L115.3,277.5 L115.3,280.7 L115.6,280.7
L115.6,283.8 L115.8,283.8 L115.8,286.9 L116.0,286.9 L116.0,289.9 L116.2,289.9 L116.2,292.8 L116.4,292.8
L116.4,295.7 L116.6,295.7 L116.6,298.5 L116.9,298.5 L116.9,301.2 L117.1,301.2 L117.1,303.9 L117.3,303.9
L117.3,306.5 L117.5,306.5 L117.5,309.1 L117.7,309.1 L117.7,311.7 L118.0,311.7 L118.0,314.1 L118.2,314.1
L118.2,316.6 L118.4,316.6 L118.4,318.9 L118.6,318.9 L118.6,321.3 L118.8,321.3 L118.8,323.6 L119.0,323.6
L119.0,325.8 L119.3,325.8 L119.3,328.0 L119.5,328.0 L119.5,330.1 L119.7,330.1 L119.7,332.2 L119.9,332.2
L119.9,334.3 L120.1,334.3 L120.1,336.3 L120.3,336.3 L120.3,338.3 L120.6,338.3 L120.6,340.2 L120.8,340.2
L120.8,342.1 L121.0,342.1 L121.0,344.0 L121.2,344.0 L121.2,345.8 L121.4,345.8 L121.4,347.6 L121.6,347.6
L121.6,349.3 L121.9,349.3 L121.9,351.1 L122.1,351.1 L122.1,352.7 L122.3,352.7 L122.3,354.4 L122.5,354.4
L122.5,356.0 L122.7,356.0 L122.7,357.6 L122.9,357.6 L122.9,359.1 L123.2,359.1 L123.2,360.6 L123.4,360.6
L123.4,362.1 L123.6,362.1 L123.6,363.6 L123.8,363.6 L123.8,365.0 L124.0,365.0 L124.0,366.4 L124.2,366.4
L124.2,367.7 L124.5,367.7 L124.5,369.1 L124.7,369.1 L124.7,370.4 L124.9,370.4 L124.9,371.7 L125.1,371.7
L125.1,372.9 L125.3,372.9 L125.3,374.2 L125.6,374.2 L125.6,375.4 L125.8,375.4 L125.8,376.5 L126.0,376.5
L126.0,377.7 L126.2,377.7 L126.2,378.8 L126.4,378.8 L126.4,379.9 L126.6,379.9 L126.6,381.0 L126.9,381.0
L126.9,382.1 L127.1,382.1 L127.1,383.1 L127.3,383.1 L127.3,384.2 L127.5,384.2 L127.5,385.2 L127.7,385.2
L127.7,386.1 L127.9,386.1 L127.9,387.1 L128.2,387.1 L128.2,388.1 L128.4,388.1 L128.4,389.0 L128.6,389.0
L128.6,389.9 L128.8,389.9 L128.8,390.8 L129.0,390.8 L129.0,391.6 L129.2,391.6 L129.2,392.5 L129.5,392.5
L129.5,393.3 L129.7,393.3 L129.7,394.1 L129.9,394.1 L129.9,394.9 L130.1,394.9 L130.1,395.7 L130.3,395.7
L130.3,396.5 L130.5,396.5 L130.5,397.2 L130.8,397.2 L130.8,398.0 L131.0,398.0 L131.0,398.7 L131.2,398.7
L131.2,399.4 L131.4,399.4 L131.4,400.1 L131.6,400.1 L131.6,400.8 L131.8,400.8 L131.8,401.4 L132.1,401.4
L132.1,402.1 L132.3,402.1 L132.3,395.1 L132.5,395.1 L132.5,388.3 L132.7,388.3 L132.7,381.6 L132.9,381.6
L132.9,375.0 L133.1,375.0 L133.1,368.5 L133.4,368.5 L133.4,362.1 L133.6,362.1 L133.6,355.9 L133.8,355.9
L133.8,349.7 L134.0,349.7 L134.0,343.7 L134.2,343.7 L134.2,337.8 L134.5,337.8 L134.5,332.0 L134.7,332.0
L134.7,326.2 L134.9,326.2 L134.9,320.6 L135.1,320.6 L135.1,315.1 L135.3,315.1 L135.3,309.7 L135.5,309.7
L135.5,304.4 L135.8,304.4 L135.8,299.2 L136.0,299.2 L136.0,294.1 L136.2,294.1 L136.2,289.1 L136.4,289.1
L136.4,284.2 L136.6,284.2 L136.6,279.3 L136.8,279.3 L136.8,274.6 L137.1,274.6 L137.1,269.9 L137.3,269.9
L137.3,265.3 L137.5,265.3 L137.5,260.8 L137.7,260.8 L137.7,256.4 L137.9,256.4 L137.9,252.1 L138.1,252.1
L138.1,247.8 L138.4,247.8 L138.4,243.6 L138.6,243.6 L138.6,239.5 L138.8,239.5 L138.8,235.5 L139.0,235.5
L139.0,231.5 L139.2,231.5 L139.2,227.6 L139.4,227.6 L139.4,223.8 L139.7,223.8 L139.7,220.1 L139.9,220.1
L139.9,216.4 L140.1,216.4 L140.1,212.8 L140.3,212.8 L140.3,209.2 L140.5,209.2 L140.5,205.7 L140.7,205.7
L140.7,202.3 L141.0,202.3 L141.0,198.9 L141.2,198.9 L141.2,195.6 L141.4,195.6 L141.4,192.4 L141.6,192.4
L141.6,189.2 L141.8,189.2 L141.8,186.1 L142.1,186.1 L142.1,183.0 L142.3,183.0 L142.3,180.0 L142.5,180.0
L142.5,177.1 L142.7,177.1 L142.7,174.2 L142.9,174.2 L142.9,171.3 L143.1,171.3 L143.1,168.5 L143.4,168.5
L143.4,165.8 L143.6,165.8 L143.6,163.1 L143.8,163.1 L143.8,160.4 L144.0,160.4 L144.0,157.8 L144.2,157.8
L144.2,155.3 L144.4,155.3 L144.4,152.8 L144.7,152.8 L144.7,150.3 L144.9,150.3 L144.9,147.9 L145.1,147.9
L145.1,145.5 L145.3,145.5 L145.3,143.2 L145.5,143.2 L145.5,140.9 L145.7,140.9 L145.7,138.6 L146.0,138.6
L146.0,136.4 L146.2,136.4 L146.2,134.3 L146.4,134.3 L146.4,132.1 L146.6,132.1 L146.6,130.0 L146.8,130.0
L146.8,128.0 L147.0,128.0 L147.0,126.0 L147.3,126.0 L147.3,124.0 L147.5,124.0 L147.5,122.0 L147.7,122.0
L147.7,120.1 L147.9,120.1 L147.9,118.3 L148.1,118.3 L148.1,116.4 L148.3,116.4 L148.3,114.6 L148.6,114.6
L148.6,112.9 L148.8,112.9 L148.8,111.1 L149.0,111.1 L149.0,109.4 L149.2,109.4 L149.2,107.7 L149.4,107.7
L149.4,106.1 L149.7,106.1 L149.7,104.5 L149.9,104.5 L149.9,102.9 L150.1,102.9 L150.1,101.3 L150.3,101.3
L150.3,99.8 L150.5,99.8 L150.5,98.3 L150.7,98.3 L150.7,96.8 L151.0,96.8 L151.0,95.3 L151.2,95.3
L151.2,93.9 L151.4,93.9 L151.4,92.5 L151.6,92.5 L151.6,91.2 L151.8,91.2 L151.8,89.8 L152.0,89.8
L152.0,88.5 L152.3,88.5 L152.3,87.2 L152.5,87.2 L152.5,85.9 L152.7,85.9 L152.7,84.7 L152.9,84.7
L152.9,83.4 L153.1,83.4 L153.1,82.2 L153.3,82.2 L153.3,81.0 L153.6,81.0 L153.6,79.9 L153.8,79.9
L153.8,78.7 L154.0,78.7 L154.0,77.6 L154.2,77.6 L154.2,76.5 L154.4,76.5 L154.4,75.4 L154.6,75.4
L154.6,74.4 L154.9,74.4 L154.9,73.3 L155.1,73.3 L155.1,72.3 L155.3,72.3 L155.3,71.3 L155.5,71.3
L155.5,70.3 L155.7,70.3 L155.7,69.3 L155.9,69.3 L155.9,68.4 L156.2,68.4 L156.2,67.4 L156.4,67.4
L156.4,66.5 L156.6,66.5 L156.6,65.6 L156.8,65.6 L156.8,64.7 L157.0,64.7 L157.0,63.9 L157.2,63.9
L157.2,63.0 L157.5,63.0 L157.5,62.2 L157.7,62.2 L157.7,61.3 L157.9,61.3 L157.9,60.5 L158.1,60.5
L158.1,59.7 L158.3,59.7 L158.3,67.3 L158.6,67.3 L158.6,74.8 L158.8,74.8 L158.8,82.1 L159.0,82.1
L159.0,89.2 L159.2,89.2 L159.2,96.2 L159.4,96.2 L159.4,103.1 L159.6,103.1 L159.6,109.8 L159.9,109.8
L159.9,116.4 L160.1,116.4 L160.1,122.9 L160.3,122.9 L160.3,129.2 L160.5,129.2 L160.5,135.4 L160.7,135.4
L160.7,141.5 L160.9,141.5 L160.9,147.5 L161.2,147.5 L161.2,153.3 L161.4,153.3 L161.4,159.0 L161.6,159.0
L161.6,164.6 L161.8,164.6 L161.8,170.1 L162.0,170.1 L162.0,175.4 L162.2,175.4 L162.2,180.7 L162.5,180.7
L162.5,185.8 L162.7,185.8 L162.7,190.9 L162.9,190.9 L162.9,195.8 L163.1,195.8 L163.1,200.7 L163.3,200.7
L163.3,205.4 L163.5,205.4 L163.5,210.1 L163.8,210.1 L163.8,214.6 L164.0,214.6 L164.0,219.1 L164.2,219.1
L164.2,223.4 L164.4,223.4 L164.4,227.7 L164.6,227.7 L164.6,231.9 L164.8,231.9 L164.8,236.0 L165.1,236.0
L165.1,240.0 L165.3,240.0 L165.3,244.0 L165.5,244.0 L165.5,247.8 L165.7,247.8 L165.7,251.6 L165.9,251.6
L165.9,255.3 L166.2,255.3 L166.2,259.0 L166.4,259.0 L166.4,262.5 L166.6,262.5 L166.6,266.0 L166.8,266.0
L166.8,269.4 L167.0,269.4 L167.0,272.7 L167.2,272.7 L167.2,276.0 L167.5,276.0 L167.5,279.2 L167.7,279.2
L167.7,282.4 L167.9,282.4 L167.9,285.4 L168.1,285.4 L168.1,288.5 L168.3,288.5 L168.3,291.4 L168.5,291.4
L168.5,294.3 L168.8,294.3 L168.8,297.1 L169.0,297.1 L169.0,299.9 L169.2,299.9 L169.2,302.6 L169.4,302.6
L169.4,305.3 L169.6,305.3 L169.6,307.9 L169.8,307.9 L169.8,310.5 L170.1,310.5 L170.1,313.0 L170.3,313.0
L170.3,315.4 L170.5,315.4 L170.5,317.8 L170.7,317.8 L170.7,320.2 L170.9,320.2 L170.9,322.5 L171.1,322.5
L171.1,324.7 L171.4,324.7 L171.4,327.0 L171.6,327.0 L171.6,329.1 L171.8,329.1 L171.8,331.3 L172.0,331.3
L172.0,333.3 L172.2,333.3 L172.2,335.4 L172.4,335.4 L172.4,337.4 L172.7,337.4 L172.7,339.3 L172.9,339.3
L172.9,341.2 L173.1,341.2 L173.1,343.1 L173.3,343.1 L173.3,345.0 L173.5,345.0 L173.5,346.8 L173.8,346.8
L173.8,348.5 L174.0,348.5 L174.0,350.3 L174.2,350.3 L174.2,351.9 L174.4,351.9 L174.4,353.6 L174.6,353.6
L174.6,355.2 L174.8,355.2 L174.8,356.8 L175.1,356.8 L175.1,358.4 L175.3,358.4 L175.3,359.9 L175.5,359.9
L175.5,361.4 L175.7,361.4 L175.7,362.9 L175.9,362.9 L175.9,364.3 L176.1,364.3 L176.1,365.7 L176.4,365.7
L176.4,367.1 L176.6,367.1 L176.6,368.4 L176.8,368.4 L176.8,369.8 L177.0,369.8 L177.0,371.1 L177.2,371.1
L177.2,372.3 L177.4,372.3 L177.4,373.6 L177.7,373.6 L177.7,374.8 L177.9,374.8 L177.9,376.0 L178.1,376.0
L178.1,377.2 L178.3,377.2 L178.3,378.3 L178.5,378.3 L178.5,379.4 L178.7,379.4 L178.7,380.5 L179.0,380.5
L179.0,381.6 L179.2,381.6 L179.2,382.7 L179.4,382.7 L179.4,383.7 L179.6,383.7 L179.6,384.7 L179.8,384.7
L179.8,385.7 L180.0,385.7 L180.0,386.7 L180.3,386.7 L180.3,387.6 L180.5,387.6 L180.5,388.5 L180.7,388.5
L180.7,389.5 L180.9,389.5 L180.9,390.3 L181.1,390.3 L181.1,391.2 L181.4,391.2 L181.4,392.1 L181.6,392.1
L181.6,392.9 L181.8,392.9 L181.8,393.7 L182.0,393.7 L182.0,394.6 L182.2,394.6 L182.2,395.3 L182.4,395.3
L182.4,396.1 L182.7,396.1 L182.7,396.9 L182.9,396.9 L182.9,397.6 L183.1,397.6 L183.1,398.3 L183.3,398.3
L183.3,399.1 L183.5,399.1 L183.5,399.8 L183.7,399.8 L183.7,400.4 L184.0,400.4 L184.0,401.1 L184.2,401.1
L184.2,401.8 L184.4,401.8 L184.4,394.9 L184.6,394.9 L184.6,388.0 L184.8,388.0 L184.8,381.3 L185.0,381.3
L185.0,374.7 L185.3,374.7 L185.3,368.2 L185.5,368.2 L185.5,361.9 L185.7,361.9 L185.7,355.6 L185.9,355.6
L185.9,349.5 L186.1,349.5 L186.1,343.5 L186.3,343.5 L186.3,337.5 L186.6,337.5 L186.6,331.7 L186.8,331.7
L186.8,326.0 L187.0,326.0 L187.0,320.4 L187.2,320.4 L187.2,314.9 L187.4,314.9 L187.4,309.5 L187.6,309.5
L187.6,304.2 L187.9,304.2 L187.9,299.0 L188.1,299.0 L188.1,293.9 L188.3,293.9 L188.3,288.9 L188.5,288.9
L188.5,284.0 L188.7,284.0 L188.7,279.1 L188.9,279.1 L188.9,274.4 L189.2,274.4 L189.2,269.7 L189.4,269.7
L189.4,265.1 L189.6,265.1 L189.6,260.6 L189.8,260.6 L189.8,256.2 L190.0,256.2 L190.0,251.9 L190.3,251.9
L190.3,247.6 L190.5,247.6 L190.5,243.4 L190.7,243.4 L190.7,239.3 L190.9,239.3 L190.9,235.3 L191.1,235.3
L191.1,231.4 L191.3,231.4 L191.3,227.5 L191.6,227.5 L191.6,223.7 L191.8,223.7 L191.8,219.9 L192.0,219.9
L192.0,216.2 L192.2,216.2 L192.2,212.6 L192.4,212.6 L192.4,209.1 L192.6,209.1 L192.6,205.6 L192.9,205.6
L192.9,202.2 L193.1,202.2 L193.1,198.8 L193.3,198.8 L193.3,195.5 L193.5,195.5 L193.5,192.3 L193.7,192.3
L193.7,189.1 L193.9,189.1 L193.9,186.0 L194.2,186.0 L194.2,182.9 L194.4,182.9 L194.4,179.9 L194.6,179.9
L194.6,177.0 L194.8,177.0 L194.8,174.0 L195.0,174.0 L195.0,171.2 L195.2,171.2 L195.2,168.4 L195.5,168.4
L195.5,165.7 L195.7,165.7 L195.7,163.0 L195.9,163.0 L195.9,160.3 L196.1,160.3 L196.1,157.7 L196.3,157.7
L196.3,155.2 L196.5,155.2 L196.5,152.7 L196.8,152.7 L196.8,150.2 L197.0,150.2 L197.0,147.8 L197.2,147.8
L197.2,145.4 L197.4,145.4 L197.4,143.1 L197.6,143.1 L197.6,140.8 L197.9,140.8 L197.9,138.5 L198.1,138.5
L198.1,136.3 L198.3,136.3 L198.3,134.2 L198.5,134.2 L198.5,132.0 L198.7,132.0 L198.7,130.0 L198.9,130.0
L198.9,127.9 L199.2,127.9 L199.2,125.9 L199.4,125.9 L199.4,123.9 L199.6,123.9 L199.6,122.0 L199.8,122.0
L199.8,120.1 L200.0,120.1 L200.0,118.2 L200.2,118.2 L200.2,116.4 L200.5,116.4 L200.5,114.6 L200.7,114.6
L200.7,112.8 L200.9,112.8 L200.9,111.0 L201.1,111.0 L201.1,109.3 L201.3,109.3 L201.3,107.7 L201.5,107.7
L201.5,106.0 L201.8,106.0 L201.8,104.4 L202.0,104.4 L202.0,102.8 L202.2,102.8 L202.2,101.2 L202.4,101.2
L202.4,99.7 L202.6,99.7 L202.6,98.2 L202.8,98.2 L202.8,96.7 L203.1,96.7 L203.1,95.3 L203.3,95.3
L203.3,93.9 L203.5,93.9 L203.5,92.5 L203.7,92.5 L203.7,91.1 L203.9,91.1 L203.9,89.8 L204.1,89.8
L204.1,88.4 L204.4,88.4 L204.4,87.1 L204.6,87.1 L204.6,85.9 L204.8,85.9 L204.8,84.6 L205.0,84.6
L205.0,83.4 L205.2,83.4 L205.2,82.2 L205.5,82.2 L205.5,81.0 L205.7,81.0 L205.7,79.8 L205.9,79.8
L205.9,78.7 L206.1,78.7 L206.1,77.6 L206.3,77.6 L206.3,76.5 L206.5,76.5 L206.5,75.4 L206.8,75.4
L206.8,74.3 L207.0,74.3 L207.0,73.3 L207.2,73.3 L207.2,72.2 L207.4,72.2 L207.4,71.2 L207.6,71.2
L207.6,70.3 L207.8,70.3 L207.8,69.3 L208.1,69.3 L208.1,68.3 L208.3,68.3 L208.3,67.4 L208.5,67.4
L208.5,66.5 L208.7,66.5 L208.7,65.6 L208.9,65.6 L208.9,64.7 L209.1,64.7 L209.1,63.8 L209.4,63.8
L209.4,63.0 L209.6,63.0 L209.6,62.1 L209.8,62.1 L209.8,61.3 L210.0,61.3 L210.0,60.5 L210.2,60.5
L210.2,59.7 L210.4,59.7 L210.4,67.2 L210.7,67.2 L210.7,74.7 L210.9,74.7 L210.9,82.0 L211.1,82.0
L211.1,89.2 L211.3,89.2 L211.3,96.2 L211.5,96.2 L211.5,103.1 L211.7,103.1 L211.7,109.8 L212.0,109.8
L212.0,116.4 L212.2,116.4 L212.2,122.8 L212.4,122.8 L212.4,129.2 L212.6,129.2 L212.6,135.4 L212.8,135.4
L212.8,141.5 L213.1,141.5 L213.1,147.4 L213.3,147.4 L213.3,153.2 L213.5,153.2 L213.5,158.9 L213.7,158.9
L213.7,164.5 L213.9,164.5 L213.9,170.0 L214.1,170.0 L214.1,175.4 L214.4,175.4 L214.4,180.6 L214.6,180.6
L214.6,185.8 L214.8,185.8 L214.8,190.8 L215.0,190.8 L215.0,195.8 L215.2,195.8 L215.2,200.6 L215.4,200.6
L215.4,205.4 L215.7,205.4 L215.7,210.0 L215.9,210.0 L215.9,214.6 L216.1,214.6 L216.1,219.0 L216.3,219.0
L216.3,223.4 L216.5,223.4 L216.5,227.7 L216.7,227.7 L216.7,231.9 L217.0,231.9 L217.0,236.0 L217.2,236.0
L217.2,240.0 L217.4,240.0 L217.4,243.9 L217.6,243.9 L217.6,247.8 L217.8,247.8 L217.8,251.6 L218.0,251.6
L218.0,255.3 L218.3,255.3 L218.3,258.9 L218.5,258.9 L218.5,262.5 L218.7,262.5 L218.7,266.0 L218.9,266.0
L218.9,269.4 L219.1,269.4 L219.1,272.7 L219.3,272.7 L219.3,276.0 L219.6,276.0 L219.6,279.2 L219.8,279.2
L219.8,282.3 L220.0,282.3 L220.0,285.4 L220.2,285.4 L220.2,288.4 L220.4,288.4 L220.4,291.4 L220.6,291.4
L220.6,294.3 L220.9,294.3 L220.9,297.1 L221.1,297.1 L221.1,299.9 L221.3,299.9 L221.3,302.6 L221.5,302.6
L221.5,305.3 L221.7,305.3 L221.7,307.9 L222.0,307.9 L222.0,310.4 L222.2,310.4 L222.2,313.0 L222.4,313.0
L222.4,315.4 L222.6,315.4 L222.6,317.8 L222.8,317.8 L222.8,320.2 L223.0,320.2 L223.0,322.5 L223.3,322.5
L223.3,324.7 L223.5,324.7 L223.5,326.9 L223.7,326.9 L223.7,329.1 L223.9,329.1 L223.9,331.2 L224.1,331.2
L224.1,333.3 L224.3,333.3 L224.3,335.4 L224.6,335.4 L224.6,337.4 L224.8,337.4 L224.8,339.3 L225.0,339.3
L225.0,341.2 L225.2,341.2 L225.2,343.1 L225.4,343.1 L225.4,344.9 L225.6,344.9 L225.6,346.7 L225.9,346.7
L225.9,348.5 L226.1,348.5 L226.1,350.2 L226.3,350.2 L226.3,351.9 L226.5,351.9 L226.5,353.6 L226.7,353.6
L226.7,355.2 L226.9,355.2 L226.9,356.8 L227.2,356.8 L227.2,358.4 L227.4,358.4 L227.4,359.9 L227.6,359.9
L227.6,361.4 L227.8,361.4 L227.8,362.9 L228.0,362.9 L228.0,364.3 L228.2,364.3 L228.2,365.7 L228.5,365.7
L228.5,367.1 L228.7,367.1 L228.7,368.4 L228.9,368.4 L228.9,369.8 L229.1,369.8 L229.1,371.1 L229.3,371.1
L229.3,372.3 L229.6,372.3 L229.6,373.6 L229.8,373.6 L229.8,374.8 L230.0,374.8 L230.0,376.0 L230.2,376.0
L230.2,377.1 L230.4,377.1 L230.4,378.3 L230.6,378.3 L230.6,379.4 L230.9,379.4 L230.9,380.5 L231.1,380.5
L231.1,381.6 L231.3,381.6 L231.3,382.6 L231.5,382.6 L231.5,383.7 L231.7,383.7 L231.7,384.7 L231.9,384.7
L231.9,385.7 L232.2,385.7 L232.2,386.7 L232.4,386.7 L232.4,387.6 L232.6,387.6 L232.6,388.5 L232.8,388.5
L232.8,389.4 L233.0,389.4 L233.0,390.3 L233.2,390.3 L233.2,391.2 L233.5,391.2 L233.5,392.1 L233.7,392.1
L233.7,392.9 L233.9,392.9 L233.9,393.7 L234.1,393.7 L234.1,394.5 L234.3,394.5 L234.3,395.3 L234.5,395.3
L234.5,396.1 L234.8,396.1 L234.8,396.9 L235.0,396.9 L235.0,397.6 L235.2,397.6 L235.2,398.3 L235.4,398.3
L235.4,399.1 L235.6,399.1 L235.6,399.8 L235.8,399.8 L235.8,400.4 L236.1,400.4 L236.1,401.1 L236.3,401.1
L236.3,401.8 L236.5,401.8 L236.5,394.9 L236.7,394.9 L236.7,388.1 L236.9,388.1 L236.9,381.3 L237.2,381.3
L237.2,374.7 L237.4,374.7 L237.4,368.2 L237.6,368.2 L237.6,361.9 L237.8,361.9 L237.8,355.6 L238.0,355.6
L238.0,349.5 L238.2,349.5 L238.2,343.5 L238.5,343.5 L238.5,337.6 L238.7,337.6 L238.7,331.7 L238.9,331.7
L238.9,326.0 L239.1,326.0 L239.1,320.4 L239.3,320.4 L239.3,314.9 L239.5,314.9 L239.5,309.5 L239.8,309.5
L239.8,304.2 L240.0,304.2 L240.0,299.0 L240.2,299.0 L240.2,293.9 L240.4,293.9 L240.4,288.9 L240.6,288.9
L240.6,284.0 L240.8,284.0 L240.8,279.1 L241.1,279.1 L241.1,274.4 L241.3,274.4 L241.3,269.7 L241.5,269.7
L241.5,265.1 L241.7,265.1 L241.7,260.7 L241.9,260.7 L241.9,256.2 L242.1,256.2 L242.1,251.9 L242.4,251.9
L242.4,247.6 L242.6,247.6 L242.6,243.5 L242.8,243.5 L242.8,239.4 L243.0,239.4 L243.0,235.3 L243.2,235.3
L243.2,231.4 L243.4,231.4 L243.4,227.5 L243.7,227.5 L243.7,223.7 L243.9,223.7 L243.9,219.9 L244.1,219.9
L244.1,216.2 L244.3,216.2 L244.3,212.6 L244.5,212.6 L244.5,209.1 L244.7,209.1 L244.7,205.6 L245.0,205.6
L245.0,202.2 L245.2,202.2 L245.2,198.8 L245.4,198.8 L245.4,195.5 L245.6,195.5 L245.6,192.3 L245.8,192.3
L245.8,189.1 L246.1,189.1 L246.1,186.0 L246.3,186.0 L246.3,182.9 L246.5,182.9 L246.5,179.9 L246.7,179.9
L246.7,177.0 L246.9,177.0 L246.9,174.1 L247.1,174.1 L247.1,171.2 L247.4,171.2 L247.4,168.4 L247.6,168.4
L247.6,165.7 L247.8,165.7 L247.8,163.0 L248.0,163.0 L248.0,160.3 L248.2,160.3 L248.2,157.7 L248.4,157.7
L248.4,155.2 L248.7,155.2 L248.7,152.7 L248.9,152.7 L248.9,150.2 L249.1,150.2 L249.1,147.8 L249.3,147.8
L249.3,145.4 L249.5,145.4 L249.5,143.1 L249.7,143.1 L249.7,140.8 L250.0,140.8 L250.0,138.5 L250.2,138.5
L250.2,136.3 L250.4,136.3 L250.4,134.2 L250.6,134.2 L250.6,132.0 L250.8,132.0 L250.8,130.0 L251.0,130.0
L251.0,127.9 L251.3,127.9 L251.3,125.9 L251.5,125.9 L251.5,123.9 L251.7,123.9 L251.7,122.0 L251.9,122.0
L251.9,120.1 L252.1,120.1 L252.1,118.2 L252.3,118.2 L252.3,116.4 L252.6,116.4 L252.6,114.6 L252.8,114.6
L252.8,112.8 L253.0,112.8 L253.0,111.1 L253.2,111.1 L253.2,109.3 L253.4,109.3 L253.4,107.7 L253.7,107.7
L253.7,106.0 L253.9,106.0 L253.9,104.4 L254.1,104.4 L254.1,102.8 L254.3,102.8 L254.3,101.3 L254.5,101.3
L254.5,99.7 L254.7,99.7 L254.7,98.2 L255.0,98.2 L255.0,96.7 L255.2,96.7 L255.2,95.3 L255.4,95.3
L255.4,93.9 L255.6,93.9 L255.6,92.5 L255.8,92.5 L255.8,91.1 L256.0,91.1 L256.0,89.8 L256.3,89.8
L256.3,88.4 L256.5,88.4 L256.5,87.1 L256.7,87.1 L256.7,85.9 L256.9,85.9 L256.9,84.6 L257.1,84.6
L257.1,83.4 L257.3,83.4 L257.3,82.2 L257.6,82.2 L257.6,81.0 L257.8,81.0 L257.8,79.8 L258.0,79.8
L258.0,78.7 L258.2,78.7 L258.2,77.6 L258.4,77.6 L258.4,76.5 L258.6,76.5 L258.6,75.4 L258.9,75.4
L258.9,74.3 L259.1,74.3 L259.1,73.3 L259.3,73.3 L259.3,72.2 L259.5,72.2 L259.5,71.2 L259.7,71.2
L259.7,70.3 L259.9,70.3 L259.9,69.3 L260.2,69.3 L260.2,68.3 L260.4,68.3 L260.4,67.4 L260.6,67.4
L260.6,66.5 L260.8,66.5 L260.8,65.6 L261.0,65.6 L261.0,64.7 L261.3,64.7 L261.3,63.8 L261.5,63.8
L261.5,63.0 L261.7,63.0 L261.7,62.1 L261.9,62.1 L261.9,61.3 L262.1,61.3 L262.1,60.5 L262.3,60.5
L262.3,59.7 L262.6,59.7 L262.6,67.2 L262.8,67.2 L262.8,74.7 L263.0,74.7 L263.0,82.0 L263.2,82.0
L263.2,89.1 L263.4,89.1 L263.4,96.2 L263.6,96.2 L263.6,103.0 L263.9,103.0 L263.9,109.8 L264.1,109.8
L264.1,116.4 L264.3,116.4 L264.3,122.8 L264.5,122.8 L264.5,129.2 L264.7,129.2 L264.7,135.4 L264.9,135.4
L264.9,141.4 L265.2,141.4 L265.2,147.4 L265.4,147.4 L265.4,153.2 L265.6,153.2 L265.6,158.9 L265.8,158.9
L265.8,164.5 L266.0,164.5 L266.0,170.0 L266.2,170.0 L266.2,175.4 L266.5,175.4 L266.5,180.6 L266.7,180.6
L266.7,185.8 L266.9,185.8 L266.9,190.8 L267.1,190.8 L267.1,195.8 L267.3,195.8 L267.3,200.6 L267.5,200.6
L267.5,205.4 L267.8,205.4 L267.8,210.0 L268.0,210.0 L268.0,214.6 L268.2,214.6 L268.2,219.0 L268.4,219.0
L268.4,223.4 L268.6,223.4 L268.6,227.7 L268.9,227.7 L268.9,231.9 L269.1,231.9 L269.1,236.0 L269.3,236.0
L269.3,240.0 L269.5,240.0 L269.5,243.9 L269.7,243.9 L269.7,247.8 L269.9,247.8 L269.9,251.6 L270.2,251.6
L270.2,255.3 L270.4,255.3 L270.4,258.9 L270.6,258.9 L270.6,262.5 L270.8,262.5 L270.8,265.9 L271.0,265.9
L271.0,269.4 L271.2,269.4 L271.2,272.7 L271.5,272.7 L271.5,276.0 L271.7,276.0 L271.7,279.2 L271.9,279.2
L271.9,282.3 L272.1,282.3 L272.1,285.4 L272.3,285.4 L272.3,288.4 L272.5,288.4 L272.5,291.4 L272.8,291.4
L272.8,294.3 L273.0,294.3 L273.0,297.1 L273.2,297.1 L273.2,299.9 L273.4,299.9 L273.4,302.6 L273.6,302.6
L273.6,305.3 L273.8,305.3 L273.8,307.9 L274.1,307.9 L274.1,310.4 L274.3,310.4 L274.3,312.9 L274.5,312.9
L274.5,315.4 L274.7,315.4 L274.7,317.8 L274.9,317.8 L274.9,320.2 L275.1,320.2 L275.1,322.5 L275.4,322.5
L275.4,324.7 L275.6,324.7 L275.6,326.9 L275.8,326.9 L275.8,329.1 L276.0,329.1 L276.0,331.2 L276.2,331.2
L276.2,333.3 L276.4,333.3 L276.4,335.3 L276.7,335.3 L276.7,337.3 L276.9,337.3 L276.9,339.3 L277.1,339.3
L277.1,341.2 L277.3,341.2 L277.3,343.1 L277.5,343.1 L277.5,344.9 L277.8,344.9 L277.8,346.7 L278.0,346.7
L278.0,348.5 L278.2,348.5 L278.2,350.2 L278.4,350.2 L278.4,351.9 L278.6,351.9 L278.6,353.6 L278.8,353.6
L278.8,355.2 L279.1,355.2 L279.1,356.8 L279.3,356.8 L279.3,358.4 L279.5,358.4 L279.5,359.9 L279.7,359.9
L279.7,361.4 L279.9,361.4 L279.9,362.9 L280.1,362.9 L280.1,364.3 L280.4,364.3 L280.4,365.7 L280.6,365.7
L280.6,367.1 L280.8,367.1 L280.8,368.4 L281.0,368.4 L281.0,369.8 L281.2,369.8 L281.2,371.0 L281.4,371.0
L281.4,372.3 L281.7,372.3 L281.7,373.6 L281.9,373.6 L281.9,374.8 L282.1,374.8 L282.1,376.0 L282.3,376.0
L282.3,377.1 L282.5,377.1 L282.5,378.3 L282.7,378.3 L282.7,379.4 L283.0,379.4 L283.0,380.5 L283.2,380.5
L283.2,381.6 L283.4,381.6 L283.4,382.6 L283.6,382.6 L283.6,383.7 L283.8,383.7 L283.8,384.7 L284.0,384.7
L284.0,385.7 L284.3,385.7 L284.3,386.6 L284.5,386.6 L284.5,387.6 L284.7,387.6 L284.7,388.5 L284.9,388.5
L284.9,389.4 L285.1,389.4 L285.1,390.3 L285.4,390.3 L285.4,391.2 L285.6,391.2 L285.6,392.1 L285.8,392.1
L285.8,392.9 L286.0,392.9 L286.0,393.7 L286.2,393.7 L286.2,394.5 L286.4,394.5 L286.4,395.3 L286.7,395.3
L286.7,396.1 L286.9,396.1 L286.9,396.9 L287.1,396.9 L287.1,397.6 L287.3,397.6 L287.3,398.3 L287.5,398.3
L287.5,399.1 L287.7,399.1 L287.7,399.8 L288.0,399.8 L288.0,400.4 L288.2,400.4 L288.2,401.1 L288.4,401.1
L288.4,401.8 L288.6,401.8 L288.6,394.9 L288.8,394.9 L288.8,388.1 L289.0,388.1 L289.0,381.4 L289.3,381.4
L289.3,374.8 L289.5,374.8 L289.5,368.3 L289.7,368.3 L289.7,361.9 L289.9,361.9 L289.9,355.7 L290.1,355.7
L290.1,349.5 L290.3,349.5 L290.3,343.5 L290.6,343.5 L290.6,337.6 L290.8,337.6 L290.8,331.8 L291.0,331.8
L291.0,326.1 L291.2,326.1 L291.2,320.5 L291.4,320.5 L291.4,315.0 L291.6,315.0 L291.6,309.6 L291.9,309.6
L291.9,304.3 L292.1,304.3 L292.1,299.1 L292.3,299.1 L292.3,294.0 L292.5,294.0 L292.5,288.9 L292.7,288.9
L292.7,284.0 L293.0,284.0 L293.0,279.2 L293.2,279.2 L293.2,274.4 L293.4,274.4 L293.4,269.7 L293.6,269.7
L293.6,265.2 L293.8,265.2 L293.8,260.7 L294.0,260.7 L294.0,256.3 L294.3,256.3 L294.3,251.9 L294.5,251.9
L294.5,247.7 L294.7,247.7 L294.7,243.5 L294.9,243.5 L294.9,239.4 L295.1,239.4 L295.1,235.3 L295.3,235.3
L295.3,231.4 L295.6,231.4 L295.6,227.5 L295.8,227.5 L295.8,223.7 L296.0,223.7 L296.0,219.9 L296.2,219.9
L296.2,216.3 L296.4,216.3 L296.4,212.6 L296.6,212.6 L296.6,209.1 L296.9,209.1 L296.9,205.6 L297.1,205.6
L297.1,202.2 L297.3,202.2 L297.3,198.8 L297.5,198.8 L297.5,195.5 L297.7,195.5 L297.7,192.3 L297.9,192.3
L297.9,189.1 L298.2,189.1 L298.2,186.0 L298.4,186.0 L298.4,182.9 L298.6,182.9 L298.6,179.9 L298.8,179.9
L298.8,177.0 L299.0,177.0 L299.0,174.1 L299.2,174.1 L299.2,171.2 L299.5,171.2 L299.5,168.4 L299.7,168.4
L299.7,165.7 L299.9,165.7 L299.9,163.0 L300.1,163.0 L300.1,160.3 L300.3,160.3 L300.3,157.7 L300.6,157.7
L300.6,155.2 L300.8,155.2 L300.8,152.7 L301.0,152.7 L301.0,150.2 L301.2,150.2 L301.2,147.8 L301.4,147.8
L301.4,145.4 L301.6,145.4 L301.6,143.1 L301.9,143.1 L301.9,140.8 L302.1,140.8 L302.1,138.6 L302.3,138.6
L302.3,136.4 L302.5,136.4 L302.5,134.2 L302.7,134.2 L302.7,132.1 L302.9,132.1 L302.9,130.0 L303.2,130.0
L303.2,127.9 L303.4,127.9 L303.4,125.9 L303.6,125.9 L303.6,123.9 L303.8,123.9 L303.8,122.0 L304.0,122.0
L304.0,120.1 L304.2,120.1 L304.2,118.2 L304.5,118.2 L304.5,116.4 L304.7,116.4 L304.7,114.6 L304.9,114.6
L304.9,112.8 L305.1,112.8 L305.1,111.1 L305.3,111.1 L305.3,109.3 L305.5,109.3 L305.5,107.7 L305.8,107.7
L305.8,106.0 L306.0,106.0 L306.0,104.4 L306.2,104.4 L306.2,102.8 L306.4,102.8 L306.4,101.3 L306.6,101.3
L306.6,99.7 L306.8,99.7 L306.8,98.2 L307.1,98.2 L307.1,96.8 L307.3,96.8 L307.3,95.3 L307.5,95.3
L307.5,93.9 L307.7,93.9 L307.7,92.5 L307.9,92.5 L307.9,91.1 L308.1,91.1 L308.1,89.8 L308.4,89.8
L308.4,88.4 L308.6,88.4 L308.6,87.1 L308.8,87.1 L308.8,85.9 L309.0,85.9 L309.0,84.6 L309.2,84.6
L309.2,83.4 L309.5,83.4 L309.5,82.2 L309.7,82.2 L309.7,81.0 L309.9,81.0 L309.9,79.8 L310.1,79.8
L310.1,78.7 L310.3,78.7 L310.3,77.6 L310.5,77.6 L310.5,76.5 L310.8,76.5 L310.8,75.4 L311.0,75.4
L311.0,74.3 L311.2,74.3 L311.2,73.3 L311.4,73.3 L311.4,72.3 L311.6,72.3 L311.6,71.2 L311.8,71.2
L311.8,70.3 L312.1,70.3 L312.1,69.3 L312.3,69.3 L312.3,68.3 L312.5,68.3 L312.5,67.4 L312.7,67.4
L312.7,66.5 L312.9,66.5 L312.9,65.6 L313.1,65.6 L313.1,64.7 L313.4,64.7 L313.4,63.8 L313.6,63.8
L313.6,63.0 L313.8,63.0 L313.8,62.1 L314.0,62.1 L314.0,61.3 L314.2,61.3 L314.2,60.5 L314.4,60.5
L314.4,59.7 L314.7,59.7 L314.7,67.2 L314.9,67.2 L314.9,74.6 L315.1,74.6 L315.1,81.9 L315.3,81.9
L315.3,89.1 L315.5,89.1 L315.5,96.1 L315.7,96.1 L315.7,103.0 L316.0,103.0 L316.0,109.7 L316.2,109.7
L316.2,116.3 L316.4,116.3 L316.4,122.8 L316.6,122.8 L316.6,129.1 L316.8,129.1 L316.8,135.3 L317.1,135.3
L317.1,141.4 L317.3,141.4 L317.3,147.4 L317.5,147.4 L317.5,153.2 L317.7,153.2 L317.7,158.9 L317.9,158.9
L317.9,164.5 L318.1,164.5 L318.1,170.0 L318.4,170.0 L318.4,175.3 L318.6,175.3 L318.6,180.6 L318.8,180.6
L318.8,185.8 L319.0,185.8 L319.0,190.8 L319.2,190.8 L319.2,195.7 L319.4,195.7 L319.4,200.6 L319.7,200.6
L319.7,205.3 L319.9,205.3 L319.9,210.0 L320.1,210.0 L320.1,214.5 L320.3,214.5 L320.3,219.0 L320.5,219.0
L320.5,223.4 L320.7,223.4 L320.7,227.6 L321.0,227.6 L321.0,231.8 L321.2,231.8 L321.2,235.9 L321.4,235.9
L321.4,240.0 L321.6,240.0 L321.6,243.9 L321.8,243.9 L321.8,247.8 L322.0,247.8 L322.0,251.6 L322.3,251.6
L322.3,255.3 L322.5,255.3 L322.5,258.9 L322.7,258.9 L322.7,262.5 L322.9,262.5 L322.9,265.9 L323.1,265.9
L323.1,269.3 L323.3,269.3 L323.3,272.7 L323.6,272.7 L323.6,276.0 L323.8,276.0 L323.8,279.2 L324.0,279.2
L324.0,282.3 L324.2,282.3 L324.2,285.4 L324.4,285.4 L324.4,288.4 L324.7,288.4 L324.7,291.4 L324.9,291.4
L324.9,294.3 L325.1,294.3 L325.1,297.1 L325.3,297.1 L325.3,299.9 L325.5,299.9 L325.5,302.6 L325.7,302.6
L325.7,305.3 L326.0,305.3 L326.0,307.9 L326.2,307.9 L326.2,310.4 L326.4,310.4 L326.4,312.9 L326.6,312.9
L326.6,315.4 L326.8,315.4 L326.8,317.8 L327.0,317.8 L327.0,320.1 L327.3,320.1 L327.3,322.5 L327.5,322.5
L327.5,324.7 L327.7,324.7 L327.7,326.9 L327.9,326.9 L327.9,329.1 L328.1,329.1 L328.1,331.2 L328.3,331.2
L328.3,333.3 L328.6,333.3 L328.6,335.3 L328.8,335.3 L328.8,337.3 L329.0,337.3 L329.0,339.3 L329.2,339.3
L329.2,341.2 L329.4,341.2 L329.4,343.1 L329.6,343.1 L329.6,344.9 L329.9,344.9 L329.9,346.7 L330.1,346.7
L330.1,348.5 L330.3,348.5 L330.3,350.2 L330.5,350.2 L330.5,351.9 L330.7,351.9 L330.7,353.6 L330.9,353.6
L330.9,355.2 L331.2,355.2 L331.2,356.8 L331.4,356.8 L331.4,358.4 L331.6,358.4 L331.6,359.9 L331.8,359.9
L331.8,361.4 L332.0,361.4 L332.0,362.9 L332.2,362.9 L332.2,364.3 L332.5,364.3 L332.5,365.7 L332.7,365.7
L332.7,367.1 L332.9,367.1 L332.9,368.4 L333.1,368.4 L333.1,369.7 L333.3,369.7 L333.3,371.0 L333.6,371.0
L333.6,372.3 L333.8,372.3 L333.8,373.6 L334.0,373.6 L334.0,374.8 L334.2,374.8 L334.2,376.0 L334.4,376.0
L334.4,377.1 L334.6,377.1 L334.6,378.3 L334.9,378.3 L334.9,379.4 L335.1,379.4 L335.1,380.5 L335.3,380.5
L335.3,381.6 L335.5,381.6 L335.5,382.6 L335.7,382.6 L335.7,383.7 L335.9,383.7 L335.9,384.7 L336.2,384.7
L336.2,385.7 L336.4,385.7 L336.4,386.6 L336.6,386.6 L336.6,387.6 L336.8,387.6 L336.8,388.5 L337.0,388.5
L337.0,389.4 L337.2,389.4 L337.2,390.3 L337.5,390.3 L337.5,391.2 L337.7,391.2 L337.7,392.1 L337.9,392.1
L337.9,392.9 L338.1,392.9 L338.1,393.7 L338.3,393.7 L338.3,394.5 L338.5,394.5 L338.5,395.3 L338.8,395.3
L338.8,396.1 L339.0,396.1 L339.0,396.9 L339.2,396.9 L339.2,397.6 L339.4,397.6 L339.4,398.3 L339.6,398.3
L339.6,399.1 L339.8,399.1 L339.8,399.7 L340.1,399.7 L340.1,400.4 L340.3,400.4 L340.3,401.1 L340.5,401.1
L340.5,401.8 L340.7,401.8 L340.7,394.9 L340.9,394.9 L340.9,388.1 L341.2,388.1 L341.2,381.4 L341.4,381.4
L341.4,374.8 L341.6,374.8 L341.6,368.3 L341.8,368.3 L341.8,361.9 L342.0,361.9 L342.0,355.7 L342.2,355.7
L342.2,349.5 L342.5,349.5 L342.5,343.5 L342.7,343.5 L342.7,337.6 L342.9,337.6 L342.9,331.8 L343.1,331.8
L343.1,326.1 L343.3,326.1 L343.3,320.5 L343.5,320.5 L343.5,315.0 L343.8,315.0 L343.8,309.6 L344.0,309.6
L344.0,304.3 L344.2,304.3 L344.2,299.1 L344.4,299.1 L344.4,294.0 L344.6,294.0 L344.6,289.0 L344.8,289.0
L344.8,284.0 L345.1,284.0 L345.1,279.2 L345.3,279.2 L345.3,274.4 L345.5,274.4 L345.5,269.8 L345.7,269.8
L345.7,265.2 L345.9,265.2 L345.9,260.7 L346.1,260.7 L346.1,256.3 L346.4,256.3 L346.4,251.9 L346.6,251.9
L346.6,247.7 L346.8,247.7 L346.8,243.5 L347.0,243.5 L347.0,239.4 L347.2,239.4 L347.2,235.4 L347.4,235.4
L347.4,231.4 L347.7,231.4 L347.7,227.5 L347.9,227.5 L347.9,223.7 L348.1,223.7 L348.1,219.9 L348.3,219.9
L348.3,216.3 L348.5,216.3 L348.5,212.7 L348.8,212.7 L348.8,209.1 L349.0,209.1 L349.0,205.6 L349.2,205.6
L349.2,202.2 L349.4,202.2 L349.4,198.8 L349.6,198.8 L349.6,195.6 L349.8,195.6 L349.8,192.3 L350.1,192.3
L350.1,189.1 L350.3,189.1 L350.3,186.0 L350.5,186.0 L350.5,182.9 L350.7,182.9 L350.7,179.9 L350.9,179.9
L350.9,177.0 L351.1,177.0 L351.1,174.1 L351.4,174.1 L351.4,171.2 L351.6,171.2 L351.6,168.4 L351.8,168.4
L351.8,165.7 L352.0,165.7 L352.0,163.0 L352.2,163.0 L352.2,160.3 L352.4,160.3 L352.4,157.7 L352.7,157.7
L352.7,155.2 L352.9,155.2 L352.9,152.7 L353.1,152.7 L353.1,150.2 L353.3,150.2 L353.3,147.8 L353.5,147.8
L353.5,145.4 L353.7,145.4 L353.7,143.1 L354.0,143.1 L354.0,140.8 L354.2,140.8 L354.2,138.6 L354.4,138.6
L354.4,136.4 L354.6,136.4 L354.6,134.2 L354.8,134.2 L354.8,132.1 L355.0,132.1 L355.0,130.0 L355.3,130.0
L355.3,127.9 L355.5,127.9 L355.5,125.9 L355.7,125.9 L355.7,123.9 L355.9,123.9 L355.9,122.0 L356.1,122.0
L356.1,120.1 L356.4,120.1 L356.4,118.2 L356.6,118.2 L356.6,116.4 L356.8,116.4 L356.8,114.6 L357.0,114.6
L357.0,112.8 L357.2,112.8 L357.2,111.1 L357.4,111.1 L357.4,109.4 L357.7,109.4 L357.7,107.7 L357.9,107.7
L357.9,106.0 L358.1,106.0 L358.1,104.4 L358.3,104.4 L358.3,102.8 L358.5,102.8 L358.5,101.3 L358.7,101.3
L358.7,99.7 L359.0,99.7 L359.0,98.2 L359.2,98.2 L359.2,96.8 L359.4,96.8 L359.4,95.3 L359.6,95.3
L359.6,93.9 L359.8,93.9 L359.8,92.5 L360.0,92.5 L360.0,91.1 L360.3,91.1 L360.3,89.8 L360.5,89.8
L360.5,88.4 L360.7,88.4 L360.7,87.1 L360.9,87.1 L360.9,85.9 L361.1,85.9 L361.1,84.6 L361.3,84.6
L361.3,83.4 L361.6,83.4 L361.6,82.2 L361.8,82.2 L361.8,81.0 L362.0,81.0 L362.0,79.8 L362.2,79.8
L362.2,78.7 L362.4,78.7 L362.4,77.6 L362.6,77.6 L362.6,76.5 L362.9,76.5 L362.9,75.4 L363.1,75.4
L363.1,74.3 L363.3,74.3 L363.3,73.3 L363.5,73.3 L363.5,72.3 L363.7,72.3 L363.7,71.2 L363.9,71.2
L363.9,70.3 L364.2,70.3 L364.2,69.3 L364.4,69.3 L364.4,68.3 L364.6,68.3 L364.6,67.4 L364.8,67.4
L364.8,66.5 L365.0,66.5 L365.0,65.6 L365.3,65.6 L365.3,64.7 L365.5,64.7 L365.5,63.8 L365.7,63.8
L365.7,63.0 L365.9,63.0 L365.9,62.1 L366.1,62.1 L366.1,61.3 L366.3,61.3 L366.3,60.5 L366.6,60.5
L366.6,59.7 L366.8,59.7 L366.8,67.1 L367.0,67.1 L367.0,74.6 L367.2,74.6 L367.2,81.9 L367.4,81.9
L367.4,89.1 L367.6,89.1 L367.6,96.1 L367.9,96.1 L367.9,103.0 L368.1,103.0 L368.1,109.7 L368.3,109.7
L368.3,116.3 L368.5,116.3 L368.5,122.8 L368.7,122.8 L368.7,129.1 L368.9,129.1 L368.9,135.3 L369.2,135.3
L369.2,141.4 L369.4,141.4 L369.4,147.3 L369.6,147.3 L369.6,153.2 L369.8,153.2 L369.8,158.9 L370.0,158.9
L370.0,164.5 L370.2,164.5 L370.2,170.0 L370.5,170.0 L370.5,175.3 L370.7,175.3 L370.7,180.6 L370.9,180.6
L370.9,185.7 L371.1,185.7 L371.1,190.8 L371.3,190.8 L371.3,195.7 L371.5,195.7 L371.5,200.6 L371.8,200.6
L371.8,205.3 L372.0,205.3 L372.0,210.0 L372.2,210.0 L372.2,214.5 L372.4,214.5 L372.4,219.0 L372.6,219.0
L372.6,223.4 L372.9,223.4 L372.9,227.6 L373.1,227.6 L373.1,231.8 L373.3,231.8 L373.3,235.9 L373.5,235.9
L373.5,240.0 L373.7,240.0 L373.7,243.9 L373.9,243.9 L373.9,247.8 L374.2,247.8 L374.2,251.5 L374.4,251.5
L374.4,255.3 L374.6,255.3 L374.6,258.9 L374.8,258.9 L374.8,262.4 L375.0,262.4 L375.0,265.9 L375.2,265.9
L375.2,269.3 L375.5,269.3 L375.5,272.7 L375.7,272.7 L375.7,276.0 L375.9,276.0 L375.9,279.2 L376.1,279.2
L376.1,282.3 L376.3,282.3 L376.3,285.4 L376.5,285.4 L376.5,288.4 L376.8,288.4 L376.8,291.4 L377.0,291.4
L377.0,294.2 L377.2,294.2 L377.2,297.1 L377.4,297.1 L377.4,299.9 L377.6,299.9 L377.6,302.6 L377.8,302.6
L377.8,305.2 L378.1,305.2 L378.1,307.9 L378.3,307.9 L378.3,310.4 L378.5,310.4 L378.5,312.9 L378.7,312.9
L378.7,315.4 L378.9,315.4 L378.9,317.8 L379.1,317.8 L379.1,320.1 L379.4,320.1 L379.4,322.4 L379.6,322.4
L379.6,324.7 L379.8,324.7 L379.8,326.9 L380.0,326.9 L380.0,329.1 L380.2,329.1 L380.2,331.2 L380.5,331.2
L380.5,333.3 L380.7,333.3 L380.7,335.3 L380.9,335.3 L380.9,337.3 L381.1,337.3 L381.1,339.3 L381.3,339.3
L381.3,341.2 L381.5,341.2 L381.5,343.1 L381.8,343.1 L381.8,344.9 L382.0,344.9 L382.0,346.7 L382.2,346.7
L382.2,348.5 L382.4,348.5 L382.4,350.2 L382.6,350.2 L382.6,351.9 L382.8,351.9 L382.8,353.6 L383.1,353.6
L383.1,355.2 L383.3,355.2 L383.3,356.8 L383.5,356.8 L383.5,358.4 L383.7,358.4 L383.7,359.9 L383.9,359.9
L383.9,361.4 L384.1,361.4 L384.1,362.8 L384.4,362.8 L384.4,364.3 L384.6,364.3 L384.6,365.7 L384.8,365.7
L384.8,367.1 L385.0,367.1 L385.0,368.4 L385.2,368.4 L385.2,369.7 L385.4,369.7 L385.4,371.0 L385.7,371.0
L385.7,372.3 L385.9,372.3 L385.9,373.6 L386.1,373.6 L386.1,374.8 L386.3,374.8 L386.3,376.0 L386.5,376.0
L386.5,377.1 L386.7,377.1 L386.7,378.3 L387.0,378.3 L387.0,379.4 L387.2,379.4 L387.2,380.5 L387.4,380.5
L387.4,381.6 L387.6,381.6 L387.6,382.6 L387.8,382.6 L387.8,383.7 L388.1,383.7 L388.1,384.7 L388.3,384.7
L388.3,385.7 L388.5,385.7 L388.5,386.6 L388.7,386.6 L388.7,387.6 L388.9,387.6 L388.9,388.5 L389.1,388.5
L389.1,389.4 L389.4,389.4 L389.4,390.3 L389.6,390.3 L389.6,391.2 L389.8,391.2 L389.8,392.1 L390.0,392.1
L390.0,392.9 L390.2,392.9 L390.2,393.7 L390.4,393.7 L390.4,394.5 L390.7,394.5 L390.7,395.3 L390.9,395.3
L390.9,396.1 L391.1,396.1 L391.1,396.9 L391.3,396.9 L391.3,397.6 L391.5,397.6 L391.5,398.3 L391.7,398.3
L391.7,399.0 L392.0,399.0 L392.0,399.7 L392.2,399.7 L392.2,400.4 L392.4,400.4 L392.4,401.1 L392.6,401.1
L392.6,401.8 L392.8,401.8 L392.8,395.0 L393.0,395.0 L393.0,388.1 L393.3,388.1 L393.3,381.4 L393.5,381.4
L393.5,374.8 L393.7,374.8 L393.7,368.3 L393.9,368.3 L393.9,362.0 L394.1,362.0 L394.1,355.7 L394.3,355.7
L394.3,349.6 L394.6,349.6 L394.6,343.5 L394.8,343.5 L394.8,337.6 L395.0,337.6 L395.0,331.8 L395.2,331.8
L395.2,326.1 L395.4,326.1 L395.4,320.5 L395.6,320.5 L395.6,315.0 L395.9,315.0 L395.9,309.6 L396.1,309.6
L396.1,304.3 L396.3,304.3 L396.3,299.1 L396.5,299.1 L396.5,294.0 L396.7,294.0 L396.7,289.0 L397.0,289.0
L397.0,284.0 L397.2,284.0 L397.2,279.2 L397.4,279.2 L397.4,274.4 L397.6,274.4 L397.6,269.8 L397.8,269.8
L397.8,265.2 L398.0,265.2 L398.0,260.7 L398.3,260.7 L398.3,256.3 L398.5,256.3 L398.5,251.9 L398.7,251.9
L398.7,247.7 L398.9,247.7 L398.9,243.5 L399.1,243.5 L399.1,239.4 L399.3,239.4 L399.3,235.4 L399.6,235.4
L399.6,231.4 L399.8,231.4 L399.8,227.5 L400.0,227.5 L400.0,223.7 L400.2,223.7 L400.2,220.0 L400.4,220.0
L400.4,216.3 L400.6,216.3 L400.6,212.7 L400.9,212.7 L400.9,209.1 L401.1,209.1 L401.1,205.6 L401.3,205.6
L401.3,202.2 L401.5,202.2 L401.5,198.9 L401.7,198.9 L401.7,195.6 L401.9,195.6 L401.9,192.3 L402.2,192.3
L402.2,189.1 L402.4,189.1 L402.4,186.0 L402.6,186.0 L402.6,183.0 L402.8,183.0 L402.8,179.9 L403.0,179.9
L403.0,177.0 L403.2,177.0 L403.2,174.1 L403.5,174.1 L403.5,171.2 L403.7,171.2 L403.7,168.4 L403.9,168.4
L403.9,165.7 L404.1,165.7 L404.1,163.0 L404.3,163.0 L404.3,160.4 L404.6,160.4 L404.6,157.8 L404.8,157.8
L404.8,155.2 L405.0,155.2 L405.0,152.7 L405.2,152.7 L405.2,150.2 L405.4,150.2 L405.4,147.8 L405.6,147.8
L405.6,145.4 L405.9,145.4 L405.9,143.1 L406.1,143.1 L406.1,140.8 L406.3,140.8 L406.3,138.6 L406.5,138.6
L406.5,136.4 L406.7,136.4 L406.7,134.2 L406.9,134.2 L406.9,132.1 L407.2,132.1 L407.2,130.0 L407.4,130.0
L407.4,127.9 L407.6,127.9 L407.6,125.9 L407.8,125.9 L407.8,123.9 L408.0,123.9 L408.0,122.0 L408.2,122.0
L408.2,120.1 L408.5,120.1 L408.5,118.2 L408.7,118.2 L408.7,116.4 L408.9,116.4 L408.9,114.6 L409.1,114.6
L409.1,112.8 L409.3,112.8 L409.3,111.1 L409.5,111.1 L409.5,109.4 L409.8,109.4 L409.8,107.7 L410.0,107.7
L410.0,106.0 L410.2,106.0 L410.2,104.4 L410.4,104.4 L410.4,102.8 L410.6,102.8 L410.6,101.3 L410.8,101.3
L410.8,99.7 L411.1,99.7 L411.1,98.2 L411.3,98.2 L411.3,96.8 L411.5,96.8 L411.5,95.3 L411.7,95.3
L411.7,93.9 L411.9,93.9 L411.9,92.5 L412.2,92.5 L412.2,91.1 L412.4,91.1 L412.4,89.8 L412.6,89.8
L412.6,88.5 L412.8,88.5 L412.8,87.2 L413.0,87.2 L413.0,85.9 L413.2,85.9 L413.2,84.6 L413.5,84.6
L413.5,83.4 L413.7,83.4 L413.7,82.2 L413.9,82.2 L413.9,81.0 L414.1,81.0 L414.1,79.8 L414.3,79.8
L414.3,78.7 L414.5,78.7 L414.5,77.6 L414.8,77.6 L414.8,76.5 L415.0,76.5 L415.0,75.4 L415.2,75.4
L415.2,74.3 L415.4,74.3 L415.4,73.3 L415.6,73.3 L415.6,72.3 L415.8,72.3 L415.8,71.3 L416.1,71.3
L416.1,70.3 L416.3,70.3 L416.3,69.3 L416.5,69.3 L416.5,68.3 L416.7,68.3 L416.7,67.4 L416.9,67.4
L416.9,66.5 L417.1,66.5 L417.1,65.6 L417.4,65.6 L417.4,64.7 L417.6,64.7 L417.6,63.8 L417.8,63.8
L417.8,63.0 L418.0,63.0 L418.0,62.1 L418.2,62.1 L418.2,61.3 L418.4,61.3 L418.4,60.5 L418.7,60.5
L418.7,59.7 L418.9,59.7 L418.9,67.1 L419.1,67.1 L419.1,74.6 L419.3,74.6 L419.3,81.9 L419.5,81.9
L419.5,89.1 L419.7,89.1 L419.7,96.1 L420.0,96.1 L420.0,103.0 L420.2,103.0 L420.2,109.7 L420.4,109.7
L420.4,116.3 L420.6,116.3 L420.6,122.8 L420.8,122.8 L420.8,129.1 L421.1,129.1 L421.1,135.3 L421.3,135.3
L421.3,141.4 L421.5,141.4 L421.5,147.3 L421.7,147.3 L421.7,153.1 L421.9,153.1 L421.9,158.9 L422.1,158.9
L422.1,164.5 L422.4,164.5 L422.4,169.9 L422.6,169.9 L422.6,175.3 L422.8,175.3 L422.8,180.6 L423.0,180.6
L423.0,185.7 L423.2,185.7 L423.2,190.8 L423.4,190.8 L423.4,195.7 L423.7,195.7 L423.7,200.6 L423.9,200.6
L423.9,205.3 L424.1,205.3 L424.1,209.9 L424.3,209.9 L424.3,214.5 L424.5,214.5 L424.5,219.0 L424.7,219.0
L424.7,223.3 L425.0,223.3 L425.0,227.6 L425.2,227.6 L425.2,231.8 L425.4,231.8 L425.4,235.9 L425.6,235.9
L425.6,239.9 L425.8,239.9 L425.8,243.9 L426.0,243.9 L426.0,247.7 L426.3,247.7 L426.3,251.5 L426.5,251.5
L426.5,255.2 L426.7,255.2 L426.7,258.9 L426.9,258.9 L426.9,262.4 L427.1,262.4 L427.1,265.9 L427.3,265.9
L427.3,269.3 L427.6,269.3 L427.6,272.7 L427.8,272.7 L427.8,275.9 L428.0,275.9 L428.0,279.1 L428.2,279.1
L428.2,282.3 L428.4,282.3 L428.4,285.4 L428.7,285.4 L428.7,288.4 L428.9,288.4 L428.9,291.3 L429.1,291.3
L429.1,294.2 L429.3,294.2 L429.3,297.1 L429.5,297.1 L429.5,299.9 L429.7,299.9 L429.7,302.6 L430.0,302.6
L430.0,305.2 L430.2,305.2 L430.2,307.8 L430.4,307.8 L430.4,310.4 L430.6,310.4 L430.6,312.9 L430.8,312.9
L430.8,315.4 L431.0,315.4 L431.0,317.8 L431.3,317.8 L431.3,320.1 L431.5,320.1 L431.5,322.4 L431.7,322.4
L431.7,324.7 L431.9,324.7 L431.9,326.9 L432.1,326.9 L432.1,329.1 L432.3,329.1 L432.3,331.2 L432.6,331.2
L432.6,333.3 L432.8,333.3 L432.8,335.3 L433.0,335.3 L433.0,337.3 L433.2,337.3 L433.2,339.3 L433.4,339.3
L433.4,341.2 L433.6,341.2 L433.6,343.1 L433.9,343.1 L433.9,344.9 L434.1,344.9 L434.1,346.7 L434.3,346.7
L434.3,348.5 L434.5,348.5 L434.5,350.2 L434.7,350.2 L434.7,351.9 L434.9,351.9 L434.9,353.6 L435.2,353.6
L435.2,355.2 L435.4,355.2 L435.4,356.8 L435.6,356.8 L435.6,358.3 L435.8,358.3 L435.8,359.9 L436.0,359.9
L436.0,361.4 L436.3,361.4 L436.3,362.8 L436.5,362.8 L436.5,364.3 L436.7,364.3 L436.7,365.7 L436.9,365.7
L436.9,367.1 L437.1,367.1 L437.1,368.4 L437.3,368.4 L437.3,369.7 L437.6,369.7 L437.6,371.0 L437.8,371.0
L437.8,372.3 L438.0,372.3 L438.0,373.5 L438.2,373.5 L438.2,374.8 L438.4,374.8 L438.4,376.0 L438.6,376.0
L438.6,377.1 L438.9,377.1 L438.9,378.3 L439.1,378.3 L439.1,379.4 L439.3,379.4 L439.3,380.5 L439.5,380.5
L439.5,381.6 L439.7,381.6 L439.7,382.6 L439.9,382.6 L439.9,383.7 L440.2,383.7 L440.2,384.7 L440.4,384.7
L440.4,385.7 L440.6,385.7 L440.6,386.6 L440.8,386.6 L440.8,387.6 L441.0,387.6 L441.0,388.5 L441.2,388.5
L441.2,389.4 L441.5,389.4 L441.5,390.3 L441.7,390.3 L441.7,391.2 L441.9,391.2 L441.9,392.1 L442.1,392.1
L442.1,392.9 L442.3,392.9 L442.3,393.7 L442.5,393.7 L442.5,394.5 L442.8,394.5 L442.8,395.3 L443.0,395.3
L443.0,396.1 L443.2,396.1 L443.2,396.9 L443.4,396.9 L443.4,397.6 L443.6,397.6 L443.6,398.3 L443.9,398.3
L443.9,399.0 L444.1,399.0 L444.1,399.7 L444.3,399.7 L444.3,400.4 L444.5,400.4 L444.5,401.1 L444.7,401.1
L444.7,401.8 L444.9,401.8 L444.9,395.0 L445.2,395.0 L445.2,388.2 L445.4,388.2 L445.4,381.4 L445.6,381.4
L445.6,374.8 L445.8,374.8 L445.8,368.3 L446.0,368.3 L446.0,362.0 L446.2,362.0 L446.2,355.7 L446.5,355.7
L446.5,349.6 L446.7,349.6 L446.7,343.6 L446.9,343.6 L446.9,337.6 L447.1,337.6 L447.1,331.8 L447.3,331.8
L447.3,326.1 L447.5,326.1 L447.5,320.5 L447.8,320.5 L447.8,315.0 L448.0,315.0 L448.0,309.6 L448.2,309.6
L448.2,304.3 L448.4,304.3 L448.4,299.1 L448.6,299.1 L448.6,294.0 L448.8,294.0 L448.8,289.0 L449.1,289.0
L449.1,284.1 L449.3,284.1 L449.3,279.2 L449.5,279.2 L449.5,274.5 L449.7,274.5 L449.7,269.8 L449.9,269.8
L449.9,265.2 L450.1,265.2 L450.1,260.7 L450.4,260.7 L450.4,256.3 L450.6,256.3 L450.6,252.0 L450.8,252.0
L450.8,247.7 L451.0,247.7 L451.0,243.5 L451.2,243.5 L451.2,239.4 L451.4,239.4 L451.4,235.4 L451.7,235.4
L451.7,231.4 L451.9,231.4 L451.9,227.5 L452.1,227.5 L452.1,223.7 L452.3,223.7 L452.3,220.0 L452.5,220.0
L452.5,216.3 L452.8,216.3 L452.8,212.7 L453.0,212.7 L453.0,209.1 L453.2,209.1 L453.2,205.7 L453.4,205.7
L453.4,202.2 L453.6,202.2 L453.6,198.9 L453.8,198.9 L453.8,195.6 L454.1,195.6 L454.1,192.3 L454.3,192.3
L454.3,189.2 L454.5,189.2 L454.5,186.0 L454.7,186.0 L454.7,183.0 L454.9,183.0 L454.9,180.0 L455.1,180.0
L455.1,177.0 L455.4,177.0 L455.4,174.1 L455.6,174.1 L455.6,171.3 L455.8,171.3 L455.8,168.5 L456.0,168.5
L456.0,165.7 L456.2,165.7 L456.2,163.0 L456.4,163.0 L456.4,160.4 L456.7,160.4 L456.7,157.8 L456.9,157.8
L456.9,155.2 L457.1,155.2 L457.1,152.7 L457.3,152.7 L457.3,150.2 L457.5,150.2 L457.5,147.8 L457.7,147.8
L457.7,145.4 L458.0,145.4 L458.0,143.1 L458.2,143.1 L458.2,140.8 L458.4,140.8 L458.4,138.6 L458.6,138.6
L458.6,136.4 L458.8,136.4 L458.8,134.2 L459.0,134.2 L459.0,132.1 L459.3,132.1 L459.3,130.0 L459.5,130.0
L459.5,127.9 L459.7,127.9 L459.7,125.9 L459.9,125.9 L459.9,124.0 L460.1,124.0 L460.1,122.0 L460.4,122.0
L460.4,120.1 L460.6,120.1 L460.6,118.2 L460.8,118.2 L460.8,116.4 L461.0,116.4 L461.0,114.6 L461.2,114.6
L461.2,112.8 L461.4,112.8 L461.4,111.1 L461.7,111.1 L461.7,109.4 L461.9,109.4 L461.9,107.7 L462.1,107.7
L462.1,106.0 L462.3,106.0 L462.3,104.4 L462.5,104.4 L462.5,102.8 L462.7,102.8 L462.7,101.3 L463.0,101.3
L463.0,99.7 L463.2,99.7 L463.2,98.2 L463.4,98.2 L463.4,96.8 L463.6,96.8 L463.6,95.3 L463.8,95.3
L463.8,93.9 L464.0,93.9 L464.0,92.5 L464.3,92.5 L464.3,91.1 L464.5,91.1 L464.5,89.8 L464.7,89.8
L464.7,88.5 L464.9,88.5 L464.9,87.2 L465.1,87.2 L465.1,85.9 L465.3,85.9 L465.3,84.6 L465.6,84.6
L465.6,83.4 L465.8,83.4 L465.8,82.2 L466.0,82.2 L466.0,81.0 L466.2,81.0 L466.2,79.8 L466.4,79.8
L466.4,78.7 L466.6,78.7 L466.6,77.6 L466.9,77.6 L466.9,76.5 L467.1,76.5 L467.1,75.4 L467.3,75.4
L467.3,74.3 L467.5,74.3 L467.5,73.3 L467.7,73.3 L467.7,72.3 L468.0,72.3 L468.0,71.3 L468.2,71.3
L468.2,70.3 L468.4,70.3 L468.4,69.3 L468.6,69.3 L468.6,68.3 L468.8,68.3 L468.8,67.4 L469.0,67.4
L469.0,66.5 L469.3,66.5 L469.3,65.6 L469.5,65.6 L469.5,64.7 L469.7,64.7 L469.7,63.8 L469.9,63.8
L469.9,63.0 L470.1,63.0 L470.1,62.1 L470.3,62.1 L470.3,61.3 L470.6,61.3 L470.6,60.5 L470.8,60.5
L470.8,59.7 L471.0,59.7 L471.0,67.1 L471.2,67.1 L471.2,74.6 L471.4,74.6 L471.4,81.9 L471.6,81.9
L471.6,89.0 L471.9,89.0 L471.9,96.1 L472.1,96.1 L472.1,102.9 L472.3,102.9 L472.3,109.7 L472.5,109.7
L472.5,116.3 L472.7,116.3 L472.7,122.7 L472.9,122.7 L472.9,129.1 L473.2,129.1 L473.2,135.3 L473.4,135.3
L473.4,141.3 L473.6,141.3 L473.6,147.3 L473.8,147.3 L473.8,153.1 L474.0,153.1 L474.0,158.8 L474.2,158.8
L474.2,164.4 L474.5,164.4 L474.5,169.9 L474.7,169.9 L474.7,175.3 L474.9,175.3 L474.9,180.5 L475.1,180.5
L475.1,185.7 L475.3,185.7 L475.3,190.7 L475.6,190.7 L475.6,195.7 L475.8,195.7 L475.8,200.5 L476.0,200.5
L476.0,205.3 L476.2,205.3 L476.2,209.9 L476.4,209.9 L476.4,214.5 L476.6,214.5 L476.6,218.9 L476.9,218.9
L476.9,223.3 L477.1,223.3 L477.1,227.6 L477.3,227.6 L477.3,231.8 L477.5,231.8 L477.5,235.9 L477.7,235.9
L477.7,239.9 L477.9,239.9 L477.9,243.9 L478.2,243.9 L478.2,247.7 L478.4,247.7 L478.4,251.5 L478.6,251.5
L478.6,255.2 L478.8,255.2 L478.8,258.9 L479.0,258.9 L479.0,262.4 L479.2,262.4 L479.2,265.9 L479.5,265.9
L479.5,269.3 L479.7,269.3 L479.7,272.7 L479.9,272.7 L479.9,275.9 L480.1,275.9 L480.1,279.1 L480.3,279.1
L480.3,282.3 L480.5,282.3 L480.5,285.4 L480.8,285.4 L480.8,288.4 L481.0,288.4 L481.0,291.3 L481.2,291.3
L481.2,294.2 L481.4,294.2 L481.4,297.1 L481.6,297.1 L481.6,299.8 L481.8,299.8 L481.8,302.6 L482.1,302.6
L482.1,305.2 L482.3,305.2 L482.3,307.8 L482.5,307.8 L482.5,310.4 L482.7,310.4 L482.7,312.9 L482.9,312.9
L482.9,315.4 L483.1,315.4 L483.1,317.8 L483.4,317.8 L483.4,320.1 L483.6,320.1 L483.6,322.4 L483.8,322.4
L483.8,324.7 L484.0,324.7 L484.0,326.9 L484.2,326.9 L484.2,329.1 L484.5,329.1 L484.5,331.2 L484.7,331.2
L484.7,333.3 L484.9,333.3 L484.9,335.3 L485.1,335.3 L485.1,337.3 L485.3,337.3 L485.3,339.3 L485.5,339.3
L485.5,341.2 L485.8,341.2 L485.8,343.1 L486.0,343.1 L486.0,344.9 L486.2,344.9 L486.2,346.7 L486.4,346.7
L486.4,348.5 L486.6,348.5 L486.6,350.2 L486.8,350.2 L486.8,351.9 L487.1,351.9 L487.1,353.6 L487.3,353.6
L487.3,355.2 L487.5,355.2 L487.5,356.8 L487.7,356.8 L487.7,358.3 L487.9,358.3 L487.9,359.9 L488.1,359.9
L488.1,361.4 L488.4,361.4 L488.4,362.8 L488.6,362.8 L488.6,364.3 L488.8,364.3 L488.8,365.7 L489.0,365.7
L489.0,367.1 L489.2,367.1 L489.2,368.4 L489.4,368.4 L489.4,369.7 L489.7,369.7 L489.7,371.0 L489.9,371.0
L489.9,372.3 L490.1,372.3 L490.1,373.5 L490.3,373.5 L490.3,374.8 L490.5,374.8 L490.5,376.0 L490.7,376.0
L490.7,377.1 L491.0,377.1 L491.0,378.3 L491.2,378.3 L491.2,379.4 L491.4,379.4 L491.4,380.5 L491.6,380.5
L491.6,381.6 L491.8,381.6 L491.8,382.6 L492.1,382.6 L492.1,383.7 L492.3,383.7 L492.3,384.7 L492.5,384.7
L492.5,385.7 L492.7,385.7 L492.7,386.6 L492.9,386.6 L492.9,387.6 L493.1,387.6 L493.1,388.5 L493.4,388.5
L493.4,389.4 L493.6,389.4 L493.6,390.3 L493.8,390.3 L493.8,391.2 L494.0,391.2 L494.0,392.1 L494.2,392.1
L494.2,392.9 L494.4,392.9 L494.4,393.7 L494.7,393.7 L494.7,394.5 L494.9,394.5 L494.9,395.3 L495.1,395.3
L495.1,396.1 L495.3,396.1 L495.3,396.9 L495.5,396.9 L495.5,397.6 L495.7,397.6 L495.7,398.3 L496.0,398.3
L496.0,399.0 L496.2,399.0 L496.2,399.7 L496.4,399.7 L496.4,400.4 L496.6,400.4 L496.6,401.1 L496.8,401.1
L496.8,401.8 L497.0,401.8 L497.0,395.0 L497.3,395.0 L497.3,388.2 L497.5,388.2 L497.5,381.5 L497.7,381.5
L497.7,374.9 L497.9,374.9 L497.9,368.4 L498.1,368.4 L498.1,362.0 L498.3,362.0 L498.3,355.8 L498.6,355.8
L498.6,349.6 L498.8,349.6 L498.8,343.6 L499.0,343.6 L499.0,337.7 L499.2,337.7 L499.2,331.9 L499.4,331.9
L499.4,326.2 L499.7,326.2 L499.7,320.6 L499.9,320.6 L499.9,315.1 L500.1,315.1 L500.1,309.7 L500.3,309.7
L500.3,304.3 L500.5,304.3 L500.5,299.1 L500.7,299.1 L500.7,294.0 L501.0,294.0 L501.0,289.0 L501.2,289.0
L501.2,284.1 L501.4,284.1 L501.4,279.2 L501.6,279.2 L501.6,274.5 L501.8,274.5 L501.8,269.8 L502.0,269.8
L502.0,265.2 L502.3,265.2 L502.3,260.7 L502.5,260.7 L502.5,256.3 L502.7,256.3 L502.7,252.0 L502.9,252.0
L502.9,247.7 L503.1,247.7 L503.1,243.5 L503.3,243.5 L503.3,239.4 L503.6,239.4 L503.6,235.4 L503.8,235.4
L503.8,231.4 L504.0,231.4 L504.0,227.6 L504.2,227.6 L504.2,223.7 L504.4,223.7 L504.4,220.0 L504.6,220.0
L504.6,216.3 L504.9,216.3 L504.9,212.7 L505.1,212.7 L505.1,209.1 L505.3,209.1 L505.3,205.7 L505.5,205.7
L505.5,202.2 L505.7,202.2 L505.7,198.9 L505.9,198.9 L505.9,195.6 L506.2,195.6 L506.2,192.3 L506.4,192.3
L506.4,189.2 L506.6,189.2 L506.6,186.0 L506.8,186.0 L506.8,183.0 L507.0,183.0 L507.0,180.0 L507.2,180.0
L507.2,177.0 L507.5,177.0 L507.5,174.1 L507.7,174.1 L507.7,171.3 L507.9,171.3 L507.9,168.5 L508.1,168.5
L508.1,165.7 L508.3,165.7 L508.3,163.0 L508.6,163.0 L508.6,160.4 L508.8,160.4 L508.8,157.8 L509.0,157.8
L509.0,155.2 L509.2,155.2 L509.2,152.7 L509.4,152.7 L509.4,150.2 L509.6,150.2 L509.6,147.8 L509.9,147.8
L509.9,145.5 L510.1,145.5 L510.1,143.1 L510.3,143.1 L510.3,140.8 L510.5,140.8 L510.5,138.6 L510.7,138.6
L510.7,136.4 L510.9,136.4 L510.9,134.2 L511.2,134.2 L511.2,132.1 L511.4,132.1 L511.4,130.0 L511.6,130.0
L511.6,127.9 L511.8,127.9 L511.8,125.9 L512.0,125.9 L512.0,124.0 L512.2,124.0 L512.2,122.0 L512.5,122.0
L512.5,120.1 L512.7,120.1 L512.7,118.2 L512.9,118.2 L512.9,116.4 L513.1,116.4 L513.1,114.6 L513.3,114.6
L513.3,112.8 L513.5,112.8 L513.5,111.1 L513.8,111.1 L513.8,109.4 L514.0,109.4 L514.0,107.7 L514.2,107.7
L514.2,106.0 L514.4,106.0 L514.4,104.4 L514.6,104.4 L514.6,102.8 L514.8,102.8 L514.8,101.3 L515.1,101.3
L515.1,99.8 L515.3,99.8 L515.3,98.2 L515.5,98.2 L515.5,96.8 L515.7,96.8 L515.7,95.3 L515.9,95.3
L515.9,93.9 L516.2,93.9 L516.2,92.5 L516.4,92.5 L516.4,91.1 L516.6,91.1 L516.6,89.8 L516.8,89.8
L516.8,88.5 L517.0,88.5 L517.0,87.2 L517.2,87.2 L517.2,85.9 L517.5,85.9 L517.5,84.6 L517.7,84.6
L517.7,83.4 L517.9,83.4 L517.9,82.2 L518.1,82.2 L518.1,81.0 L518.3,81.0 L518.3,79.8 L518.5,79.8
L518.5,78.7 L518.8,78.7 L518.8,77.6 L519.0,77.6 L519.0,76.5 L519.2,76.5 L519.2,75.4 L519.4,75.4
L519.4,74.3 L519.6,74.3 L519.6,73.3 L519.8,73.3 L519.8,72.3 L520.1,72.3 L520.1,71.3 L520.3,71.3
L520.3,70.3 L520.5,70.3 L520.5,69.3 L520.7,69.3 L520.7,68.4 L520.9,68.4 L520.9,67.4 L521.1,67.4
L521.1,66.5 L521.4,66.5 L521.4,65.6 L521.6,65.6 L521.6,64.7 L521.8,64.7 L521.8,63.8 L522.0,63.8
L522.0,63.0 L522.2,63.0 L522.2,62.2 L522.4,62.2 L522.4,61.3 L522.7,61.3 L522.7,60.5 L522.9,60.5
L522.9,59.7 L523.1,59.7 L523.1,67.1 L523.3,67.1 L523.3,74.5 L523.5,74.5 L523.5,81.8 L523.8,81.8
L523.8,89.0 L524.0,89.0 L524.0,96.0 L524.2,96.0 L524.2,102.9 L524.4,102.9 L524.4,109.6 L524.6,109.6
L524.6,116.2 L524.8,116.2 L524.8,122.7 L525.1,122.7 L525.1,129.0 L525.3,129.0 L525.3,135.2 L525.5,135.2
L525.5,141.3 L525.7,141.3 L525.7,147.3 L525.9,147.3 L525.9,153.1 L526.1,153.1 L526.1,158.8 L526.4,158.8
L526.4,164.4 L526.6,164.4 L526.6,169.9 L526.8,169.9 L526.8,175.3 L527.0,175.3 L527.0,180.5 L527.2,180.5
L527.2,185.7 L527.4,185.7 L527.4,190.7 L527.7,190.7 L527.7,195.7 L527.9,195.7 L527.9,200.5 L528.1,200.5
L528.1,205.3 L528.3,205.3 L528.3,209.9 L528.5,209.9 L528.5,214.5 L528.7,214.5 L528.7,218.9 L529.0,218.9
L529.0,223.3 L529.2,223.3 L529.2,227.6 L529.4,227.6 L529.4,231.8 L529.6,231.8 L529.6,235.9 L529.8,235.9
L529.8,239.9 L530.0,239.9 L530.0,243.9 L530.3,243.9 L530.3,247.7 L530.5,247.7 L530.5,251.5 L530.7,251.5
L530.7,255.2 L530.9,255.2 L530.9,258.8 L531.1,258.8 L531.1,262.4 L531.4,262.4 L531.4,265.9 L531.6,265.9
L531.6,269.3 L531.8,269.3 L531.8,272.6 L532.0,272.6 L532.0,275.9 L532.2,275.9 L532.2,279.1 L532.4,279.1
L532.4,282.3 L532.7,282.3 L532.7,285.3 L532.9,285.3 L532.9,288.4 L533.1,288.4 L533.1,291.3 L533.3,291.3
L533.3,294.2 L533.5,294.2 L533.5,297.1 L533.7,297.1 L533.7,299.8 L534.0,299.8 L534.0,302.6 L534.2,302.6
L534.2,305.2 L534.4,305.2 L534.4,307.8 L534.6,307.8 L534.6,310.4 L534.8,310.4 L534.8,312.9 L535.0,312.9
L535.0,315.3 L535.3,315.3 L535.3,317.8 L535.5,317.8 L535.5,320.1 L535.7,320.1 L535.7,322.4 L535.9,322.4
L535.9,324.7 L536.1,324.7 L536.1,326.9 L536.3,326.9 L536.3,329.1 L536.6,329.1 L536.6,331.2 L536.8,331.2
L536.8,333.3 L537.0,333.3 L537.0,335.3 L537.2,335.3 L537.2,337.3 L537.4,337.3 L537.4,339.3 L537.6,339.3
L537.6,341.2 L537.9,341.2 L537.9,343.1 L538.1,343.1 L538.1,344.9 L538.3,344.9 L538.3,346.7 L538.5,346.7
L538.5,348.5 L538.7,348.5 L538.7,350.2 L538.9,350.2 L538.9,351.9 L539.2,351.9 L539.2,353.6 L539.4,353.6
L539.4,355.2 L539.6,355.2 L539.6,356.8 L539.8,356.8 L539.8,358.3 L540.0,358.3 L540.0,359.9 L540.3,359.9
L540.3,361.4 L540.5,361.4 L540.5,362.8 L540.7,362.8 L540.7,364.3 L540.9,364.3 L540.9,365.7 L541.1,365.7
L541.1,367.1 L541.3,367.1 L541.3,368.4 L541.6,368.4 L541.6,369.7 L541.8,369.7 L541.8,371.0 L542.0,371.0
L542.0,372.3 L542.2,372.3 L542.2,373.5 L542.4,373.5 L542.4,374.8 L542.6,374.8 L542.6,376.0 L542.9,376.0
L542.9,377.1 L543.1,377.1 L543.1,378.3 L543.3,378.3 L543.3,379.4 L543.5,379.4 L543.5,380.5 L543.7,380.5
L543.7,381.6 L543.9,381.6 L543.9,382.6 L544.2,382.6 L544.2,383.7 L544.4,383.7 L544.4,384.7 L544.6,384.7
L544.6,385.7 L544.8,385.7 L544.8,386.6 L545.0,386.6 L545.0,387.6 L545.2,387.6 L545.2,388.5 L545.5,388.5
L545.5,389.4 L545.7,389.4 L545.7,390.3 L545.9,390.3 L545.9,391.2 L546.1,391.2 L546.1,392.1 L546.3,392.1
L546.3,392.9 L546.5,392.9 L546.5,393.7 L546.8,393.7 L546.8,394.5 L547.0,394.5 L547.0,395.3 L547.2,395.3
L547.2,396.1 L547.4,396.1 L547.4,396.9 L547.6,396.9 L547.6,397.6 L547.9,397.6 L547.9,398.3 L548.1,398.3
L548.1,399.0 L548.3,399.0 L548.3,399.7 L548.5,399.7 L548.5,400.4 L548.7,400.4 L548.7,401.1 L548.9,401.1
L548.9,401.8 L549.2,401.8 L549.2,395.1 L549.4,395.1 L549.4,388.2 L549.6,388.2 L549.6,381.5 L549.8,381.5
L549.8,374.9 L550.0,374.9 L550.0,368.4 L550.2,368.4 L550.2,362.0 L550.5,362.0 L550.5,355.8 L550.7,355.8
L550.7,349.6 L550.9,349.6 L550.9,343.6 L551.1,343.6 L551.1,337.7 L551.3,337.7 L551.3,331.9 L551.5,331.9
L551.5,326.2 L551.8,326.2 L551.8,320.6 L552.0,320.6 L552.0,315.1 L552.2,315.1 L552.2,309.7 L552.4,309.7
L552.4,304.4 L552.6,304.4 L552.6,299.2 L552.8,299.2 L552.8,294.0 L553.1,294.0 L553.1,289.0 L553.3,289.0
L553.3,284.1 L553.5,284.1 L553.5,279.3 L553.7,279.3 L553.7,274.5 L553.9,274.5 L553.9,269.8 L554.1,269.8
L554.1,265.3 L554.4,265.3 L554.4,260.8 L554.6,260.8 L554.6,256.3 L554.8,256.3 L554.8,252.0 L555.0,252.0
L555.0,247.7 L555.2,247.7 L555.2,243.6 L555.5,243.6 L555.5,239.4 L555.7,239.4 L555.7,235.4 L555.9,235.4
L555.9,231.5 L556.1,231.5 L556.1,227.6 L556.3,227.6 L556.3,223.8 L556.5,223.8 L556.5,220.0 L556.8,220.0
L556.8,216.3 L557.0,216.3 L557.0,212.7 L557.2,212.7 L557.2,209.2 L557.4,209.2 L557.4,205.7 L557.6,205.7
L557.6,202.3 L557.8,202.3 L557.8,198.9 L558.1,198.9 L558.1,195.6 L558.3,195.6 L558.3,192.4 L558.5,192.4
L558.5,189.2 L558.7,189.2 L558.7,186.1 L558.9,186.1 L558.9,183.0 L559.1,183.0 L559.1,180.0 L559.4,180.0
L559.4,177.0 L559.6,177.0 L559.6,174.1 L559.8,174.1 L559.8,171.3 L560.0,171.3 L560.0,168.5 L560.2,168.5
L560.2,165.7 L560.4,165.7 L560.4,163.0 L560.7,163.0 L560.7,160.4 L560.9,160.4 L560.9,157.8 L561.1,157.8
L561.1,155.2 L561.3,155.2 L561.3,152.7 L561.5,152.7 L561.5,150.3 L561.7,150.3 L561.7,147.8 L562.0,147.8
L562.0,145.5 L562.2,145.5 L562.2,143.1 L562.4,143.1 L562.4,140.8 L562.6,140.8 L562.6,138.6 L562.8,138.6
L562.8,136.4 L563.1,136.4 L563.1,134.2 L563.3,134.2 L563.3,132.1 L563.5,132.1 L563.5,130.0 L563.7,130.0
L563.7,128.0 L563.9,128.0 L563.9,125.9 L564.1,125.9 L564.1,124.0 L564.4,124.0 L564.4,122.0 L564.6,122.0
L564.6,120.1 L564.8,120.1 L564.8,118.2 L565.0,118.2 L565.0,116.4 L565.2,116.4 L565.2,114.6 L565.4,114.6
L565.4,112.8 L565.7,112.8 L565.7,111.1 L565.9,111.1 L565.9,109.4 L566.1,109.4 L566.1,107.7 L566.3,107.7
L566.3,106.1 L566.5,106.1 L566.5,104.4 L566.7,104.4 L566.7,102.9 L567.0,102.9 L567.0,101.3 L567.2,101.3
L567.2,99.8 L567.4,99.8 L567.4,98.3 L567.6,98.3 L567.6,96.8 L567.8,96.8 L567.8,95.3 L568.0,95.3
L568.0,93.9 L568.3,93.9 L568.3,92.5 L568.5,92.5 L568.5,91.1 L568.7,91.1 L568.7,89.8 L568.9,89.8
L568.9,88.5 L569.1,88.5 L569.1,87.2 L569.3,87.2 L569.3,85.9 L569.6,85.9 L569.6,84.6 L569.8,84.6
L569.8,83.4 L570.0,83.4 L570.0,82.2 L570.2,82.2 L570.2,81.0 L570.4,81.0 L570.4,79.9 L570.6,79.9
L570.6,78.7 L570.9,78.7 L570.9,77.6 L571.1,77.6 L571.1,76.5 L571.3,76.5 L571.3,75.4 L571.5,75.4
L571.5,74.3 L571.7,74.3 L571.7,73.3 L572.0,73.3 L572.0,72.3 L572.2,72.3 L572.2,71.3 L572.4,71.3
L572.4,70.3 L572.6,70.3 L572.6,69.3 L572.8,69.3 L572.8,68.4 L573.0,68.4 L573.0,67.4 L573.3,67.4
L573.3,66.5 L573.5,66.5 L573.5,65.6 L573.7,65.6 L573.7,64.7 L573.9,64.7 L573.9,63.8 L574.1,63.8
L574.1,63.0 L574.3,63.0 L574.3,62.2 L574.6,62.2 L574.6,61.3 L574.8,61.3 L574.8,60.5 L575.0,60.5
L575.0,59.7 '/></g>
</g>
<g id="gnuplot_plot_2" ><title>gnuplot_plot_2</title>
<g style="fill:none; color:green; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
<g transform="translate(507.9,57.2)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
<text>I</text>
</g>
<path d='M516.2,52.7 L558.4,52.7 M53.9,444.0 L53.9,433.3 L80.0,433.3 L80.0,16.7 L106.0,16.7 L106.0,433.3
L132.1,433.3 L132.1,16.7 L158.1,16.7 L158.1,433.3 L184.2,433.3 L184.2,16.7 L210.2,16.7 L210.2,433.3
L236.3,433.3 L236.3,16.7 L262.3,16.7 L262.3,433.3 L288.4,433.3 L288.4,16.7 L314.5,16.7 L314.5,433.3
L340.5,433.3 L340.5,16.7 L366.6,16.7 L366.6,433.3 L392.6,433.3 L392.6,16.7 L418.7,16.7 L418.7,433.3
L444.7,433.3 L444.7,16.7 L470.8,16.7 L470.8,433.3 L496.8,433.3 L496.8,16.7 L522.9,16.7 L522.9,433.3
L548.9,433.3 L548.9,16.7 '/></g>
</g>
<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
<path stroke='black' d='M53.9,16.7 L53.9,444.0 L575.0,444.0 L575.0,16.7 L53.9,16.7 Z '/></g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 69 KiB

View File

@ -18,18 +18,20 @@
namespace netlist
{
#if (NL_USE_MEMPOOL)
static plib::mempool p(65536, 8);
namespace detail
{
#if (USE_MEMPOOL)
static plib::mempool pool(65536, 8);
void * object_t::operator new (size_t size)
{
return p.alloc(size);
return pool.alloc(size);
}
void object_t::operator delete (void * mem)
{
if (mem)
p.free(mem);
pool.free(mem);
}
#else
void * object_t::operator new (size_t size)
@ -44,6 +46,8 @@ void object_t::operator delete (void * mem)
}
#endif
}
// ----------------------------------------------------------------------------------------
// logic_family_ttl_t
// ----------------------------------------------------------------------------------------
@ -101,7 +105,7 @@ const logic_family_desc_t *family_CD4XXX()
// queue_t
// ----------------------------------------------------------------------------------------
queue_t::queue_t(netlist_t &nl)
detail::queue_t::queue_t(netlist_t &nl)
: timed_queue<net_t *, netlist_time>(512)
, object_t("QUEUE")
, netlist_ref(nl)
@ -112,7 +116,7 @@ queue_t::queue_t(netlist_t &nl)
{
}
void queue_t::register_state(plib::state_manager_t &manager, const pstring &module)
void detail::queue_t::register_state(plib::state_manager_t &manager, const pstring &module)
{
netlist().log().debug("register_state\n");
manager.save_item(this, m_qsize, module + "." + "qsize");
@ -120,30 +124,30 @@ void queue_t::register_state(plib::state_manager_t &manager, const pstring &modu
manager.save_item(this, &(m_names[0].m_buf[0]), module + "." + "names", m_names.size() * sizeof(names_t));
}
void queue_t::on_pre_save()
void detail::queue_t::on_pre_save()
{
netlist().log().debug("on_pre_save\n");
m_qsize = this->size();
netlist().log().debug("current time {1} qsize {2}\n", netlist().time().as_double(), m_qsize);
for (int i = 0; i < m_qsize; i++ )
for (std::size_t i = 0; i < m_qsize; i++ )
{
m_times[i] = this->listptr()[i].m_exec_time.as_raw();
pstring p = this->listptr()[i].m_object->name();
int n = p.len();
n = std::min(63, n);
std::size_t n = p.len();
if (n > 63) n = 63;
std::strncpy(m_names[i].m_buf, p.cstr(), n);
m_names[i].m_buf[n] = 0;
}
}
void queue_t::on_post_load()
void detail::queue_t::on_post_load()
{
this->clear();
netlist().log().debug("current time {1} qsize {2}\n", netlist().time().as_double(), m_qsize);
for (int i = 0; i < m_qsize; i++ )
for (std::size_t i = 0; i < m_qsize; i++ )
{
net_t *n = netlist().find_net(m_names[i].m_buf);
detail::net_t *n = netlist().find_net(m_names[i].m_buf);
//log().debug("Got {1} ==> {2}\n", qtemp[i].m_name, n));
//log().debug("schedule time {1} ({2})\n", n->time().as_double(), netlist_time::from_raw(m_times[i]).as_double()));
this->push(netlist_time::from_raw(m_times[i]), n);
@ -154,16 +158,16 @@ void queue_t::on_post_load()
// object_t
// ----------------------------------------------------------------------------------------
object_t::object_t(const pstring &aname)
detail::object_t::object_t(const pstring &aname)
: m_name(aname)
{
}
object_t::~object_t()
detail::object_t::~object_t()
{
}
const pstring &object_t::name() const
const pstring &detail::object_t::name() const
{
return m_name;
}
@ -172,7 +176,7 @@ const pstring &object_t::name() const
// device_object_t
// ----------------------------------------------------------------------------------------
device_object_t::device_object_t(core_device_t &dev, const pstring &aname, const type_t atype)
detail::device_object_t::device_object_t(core_device_t &dev, const pstring &aname, const type_t atype)
: object_t(aname)
, m_device(dev)
, m_type(atype)
@ -227,6 +231,60 @@ void netlist_t::start()
{
/* load the library ... */
/* make sure the solver and parameters are started first! */
for (auto & e : setup().m_device_factory)
{
if ( setup().factory().is_class<devices::NETLIB_NAME(mainclock)>(e.second)
|| setup().factory().is_class<devices::NETLIB_NAME(solver)>(e.second)
|| setup().factory().is_class<devices::NETLIB_NAME(gnd)>(e.second)
|| setup().factory().is_class<devices::NETLIB_NAME(netlistparams)>(e.second))
{
auto dev = plib::owned_ptr<device_t>(e.second->Create(*this, e.first));
register_dev(std::move(dev));
}
}
log().debug("Searching for mainclock and solver ...\n");
m_mainclock = get_single_device<devices::NETLIB_NAME(mainclock)>("mainclock");
m_solver = get_single_device<devices::NETLIB_NAME(solver)>("solver");
m_gnd = get_single_device<devices::NETLIB_NAME(gnd)>("gnd");
m_params = get_single_device<devices::NETLIB_NAME(netlistparams)>("parameter");
/* create devices */
for (auto & e : setup().m_device_factory)
{
if ( !setup().factory().is_class<devices::NETLIB_NAME(mainclock)>(e.second)
&& !setup().factory().is_class<devices::NETLIB_NAME(solver)>(e.second)
&& !setup().factory().is_class<devices::NETLIB_NAME(gnd)>(e.second)
&& !setup().factory().is_class<devices::NETLIB_NAME(netlistparams)>(e.second))
{
auto dev = plib::owned_ptr<device_t>(e.second->Create(*this, e.first));
register_dev(std::move(dev));
}
}
bool use_deactivate = (m_params->m_use_deactivate() ? true : false);
for (auto &d : m_devices)
{
if (use_deactivate)
{
auto p = setup().m_param_values.find(d->name() + ".HINT_NO_DEACTIVATE");
if (p != setup().m_param_values.end())
{
//FIXME: Error checking
auto v = p->second.as_long();
d->set_hint_deactivate(!v);
}
}
else
d->set_hint_deactivate(false);
}
pstring libpath = plib::util::environment("NL_BOOSTLIB", plib::util::buildpath({".", "nlboost.so"}));
m_lib = plib::palloc<plib::dynlib>(libpath);
@ -243,7 +301,7 @@ void netlist_t::stop()
dev->stop_dev();
}
net_t *netlist_t::find_net(const pstring &name)
detail::net_t *netlist_t::find_net(const pstring &name)
{
for (auto & net : m_nets)
if (net->name() == name)
@ -291,8 +349,9 @@ void netlist_t::reset()
* It is however not acceptable that this depends on the startup order.
* Best would be, if reset would call update_dev for devices which need it.
*/
for (int i = m_devices.size() - 1; i >= 0; i--)
m_devices[i]->update_dev();
std::size_t i = m_devices.size();
while (i>0)
m_devices[--i]->update_dev();
#endif
}
@ -307,7 +366,7 @@ void netlist_t::process_queue(const netlist_time &delta)
if (m_mainclock == nullptr)
{
queue_t::entry_t e(m_queue.pop());
detail::queue_t::entry_t e(m_queue.pop());
m_time = e.m_exec_time;
while (e.m_object != nullptr)
{
@ -333,7 +392,7 @@ void netlist_t::process_queue(const netlist_time &delta)
mc_net.update_devs();
}
const queue_t::entry_t e(m_queue.pop());
const detail::queue_t::entry_t e(m_queue.pop());
m_time = e.m_exec_time;
if (e.m_object == nullptr)
break;
@ -379,7 +438,9 @@ void netlist_t::print_stats() const
}
overhead.stop();
uint_least64_t total_overhead = (uint_least64_t) overhead()*(uint_least64_t)total_count/(uint_least64_t)200000;
nperftime_t::type total_overhead = overhead()
* static_cast<nperftime_t::type>(total_count)
/ static_cast<nperftime_t::type>(200000);
log().verbose("Queue Pushes {1:15}", queue().m_prof_call());
log().verbose("Queue Moves {1:15}", queue().m_prof_sortmove());
@ -391,7 +452,9 @@ void netlist_t::print_stats() const
log().verbose("");
log().verbose("Take the next lines with a grain of salt. They depend on the measurement implementation.");
log().verbose("Total overhead {1:15}", total_overhead);
log().verbose("Overhead per pop {1:11}", (m_stat_mainloop()-2*total_overhead - (total_time - total_overhead ))/queue().m_prof_call());
nperftime_t::type overhead_per_pop = (m_stat_mainloop()-2*total_overhead - (total_time - total_overhead))
/ static_cast<nperftime_t::type>(queue().m_prof_call());
log().verbose("Overhead per pop {1:11}", overhead_per_pop );
log().verbose("");
for (auto &entry : m_devices)
{
@ -478,20 +541,6 @@ void core_device_t::stop_dev()
//stop();
}
netlist_sig_t core_device_t::INPLOGIC_PASSIVE(logic_input_t &inp)
{
if (inp.state() != logic_t::STATE_INP_PASSIVE)
return inp.Q();
else
{
inp.activate();
const netlist_sig_t ret = inp.Q();
inp.inactivate();
return ret;
}
}
// ----------------------------------------------------------------------------------------
// device_t
// ----------------------------------------------------------------------------------------
@ -506,7 +555,7 @@ setup_t &device_t::setup()
return netlist().setup();
}
void device_t::register_subalias(const pstring &name, core_terminal_t &term)
void device_t::register_subalias(const pstring &name, detail::core_terminal_t &term)
{
pstring alias = this->name() + "." + name;
@ -523,7 +572,7 @@ void device_t::register_subalias(const pstring &name, const pstring &aliased)
setup().register_alias_nofqn(alias, aliased_fqn);
}
void device_t::connect_late(core_terminal_t &t1, core_terminal_t &t2)
void device_t::connect_late(detail::core_terminal_t &t1, detail::core_terminal_t &t2)
{
setup().register_link_fqn(t1.name(), t2.name());
}
@ -536,7 +585,7 @@ void device_t::connect_late(const pstring &t1, const pstring &t2)
/* FIXME: this is only used by solver code since matrix solvers are started in
* post_start.
*/
void device_t::connect_post_start(core_terminal_t &t1, core_terminal_t &t2)
void device_t::connect_post_start(detail::core_terminal_t &t1, detail::core_terminal_t &t2)
{
if (!setup().connect(t1, t2))
netlist().log().fatal("Error connecting {1} to {2}\n", t1.name(), t2.name());
@ -547,12 +596,12 @@ void device_t::connect_post_start(core_terminal_t &t1, core_terminal_t &t2)
// family_setter_t
// -----------------------------------------------------------------------------
family_setter_t::family_setter_t(core_device_t &dev, const char *desc)
detail::family_setter_t::family_setter_t(core_device_t &dev, const char *desc)
{
dev.set_logic_family(dev.netlist().setup().family_from_model(desc));
}
family_setter_t::family_setter_t(core_device_t &dev, const logic_family_desc_t *desc)
detail::family_setter_t::family_setter_t(core_device_t &dev, const logic_family_desc_t *desc)
{
dev.set_logic_family(desc);
}
@ -568,7 +617,7 @@ struct do_nothing_deleter{
};
net_t::net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr)
detail::net_t::net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr)
: object_t(aname)
, netlist_ref(nl)
, m_new_Q(*this, "m_new_Q", 0)
@ -586,16 +635,16 @@ net_t::net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr)
nl.m_nets.push_back(plib::owned_ptr<net_t>(this, true));
}
net_t::~net_t()
detail::net_t::~net_t()
{
netlist().state().remove_save_items(this);
}
void net_t::inc_active(core_terminal_t &term)
void detail::net_t::inc_active(core_terminal_t &term)
{
m_active++;
m_list_active.push_front(&term);
nl_assert(m_active <= (int) num_cons());
nl_assert(m_active <= static_cast<int>(num_cons()));
if (m_active == 1)
{
railterminal().device().do_inc_active();
@ -615,7 +664,7 @@ void net_t::inc_active(core_terminal_t &term)
}
}
void net_t::dec_active(core_terminal_t &term)
void detail::net_t::dec_active(core_terminal_t &term)
{
--m_active;
nl_assert(m_active >= 0);
@ -624,7 +673,7 @@ void net_t::dec_active(core_terminal_t &term)
railterminal().device().do_dec_active();
}
void net_t::rebuild_list()
void detail::net_t::rebuild_list()
{
/* rebuild m_list */
@ -639,7 +688,7 @@ void net_t::rebuild_list()
m_active = cnt;
}
void net_t::update_devs()
void detail::net_t::update_devs()
{
//assert(m_num_cons != 0);
nl_assert(this->isRailNet());
@ -665,7 +714,7 @@ void net_t::update_devs()
}
}
void net_t::reset()
void detail::net_t::reset()
{
m_time = netlist_time::zero();
m_active = 0;
@ -689,7 +738,7 @@ void net_t::reset()
m_active++;
}
void net_t::register_con(core_terminal_t &terminal)
void detail::net_t::register_con(detail::core_terminal_t &terminal)
{
terminal.set_net(this);
@ -699,15 +748,15 @@ void net_t::register_con(core_terminal_t &terminal)
m_active++;
}
void net_t::move_connections(net_t *dest_net)
void detail::net_t::move_connections(detail::net_t *dest_net)
{
for (core_terminal_t *ct : m_core_terms)
for (auto &ct : m_core_terms)
dest_net->register_con(*ct);
m_core_terms.clear();
m_active = 0;
}
void net_t::merge_net(net_t *othernet)
void detail::net_t::merge_net(detail::net_t *othernet)
{
netlist().log().debug("merging nets ...\n");
if (othernet == nullptr)
@ -738,7 +787,7 @@ void net_t::merge_net(net_t *othernet)
// logic_net_t
// ----------------------------------------------------------------------------------------
logic_net_t::logic_net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr)
logic_net_t::logic_net_t(netlist_t &nl, const pstring &aname, detail::core_terminal_t *mr)
: net_t(nl, aname, mr)
{
}
@ -748,7 +797,7 @@ logic_net_t::logic_net_t(netlist_t &nl, const pstring &aname, core_terminal_t *m
// analog_net_t
// ----------------------------------------------------------------------------------------
analog_net_t::analog_net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr)
analog_net_t::analog_net_t(netlist_t &nl, const pstring &aname, detail::core_terminal_t *mr)
: net_t(nl, aname, mr)
, m_solver(nullptr)
{
@ -772,7 +821,7 @@ void analog_net_t::process_net(std::vector<list_t> &groups)
return;
/* add the net */
groups.back().push_back(this);
for (core_terminal_t *p : m_core_terms)
for (auto &p : m_core_terms)
{
if (p->is_type(terminal_t::TERMINAL))
{
@ -789,7 +838,7 @@ void analog_net_t::process_net(std::vector<list_t> &groups)
// core_terminal_t
// ----------------------------------------------------------------------------------------
core_terminal_t::core_terminal_t(core_device_t &dev, const pstring &aname, const type_t atype)
detail::core_terminal_t::core_terminal_t(core_device_t &dev, const pstring &aname, const type_t atype)
: device_object_t(dev, dev.name() + "." + aname, atype)
, plib::linkedlist_t<core_terminal_t>::element_t()
, m_net(nullptr)
@ -797,7 +846,7 @@ core_terminal_t::core_terminal_t(core_device_t &dev, const pstring &aname, const
{
}
void core_terminal_t::reset()
void detail::core_terminal_t::reset()
{
if (is_type(OUTPUT))
set_state(STATE_OUT);
@ -805,12 +854,12 @@ void core_terminal_t::reset()
set_state(STATE_INP_ACTIVE);
}
void core_terminal_t::set_net(net_t *anet)
void detail::core_terminal_t::set_net(net_t *anet)
{
m_net = anet;
}
void core_terminal_t::clear_net()
void detail::core_terminal_t::clear_net()
{
m_net = nullptr;
}

View File

@ -1,154 +1,8 @@
// license:GPL-2.0+
// copyright-holders:Couriersud
/*
* nlbase.h
/*!
*
* A mixed signal circuit simulation
*
* D: Device
* O: Rail output (output)
* I: Infinite impedance input (input)
* T: Terminal (finite impedance)
*
* +---+ +---+ +---+ +---+ +---+
* | | | | | | | | | |
* | D | | D | | D | | D | | D |
* | | | | | | | | | |
* +-O-+ +-I-+ +-I-+ +-T-+ +-T-+
* | | | | |
* +-+---------+---------+---------+---------+-+
* | rail net |
* +-------------------------------------------+
*
* A rail net is a net which is driven by exactly one output with an
* (idealized) internal resistance of zero.
* Ideally, it can deliver infinite current.
*
* A infinite resistance input does not source or sink current.
*
* Terminals source or sink finite (but never zero) current.
*
* The system differentiates between analog and logic input and outputs and
* analog terminals. Analog and logic devices can not be connected to the
* same net. Instead, proxy devices are inserted automatically:
*
* +---+ +---+
* | | | |
* | D1| | D2|
* | A | | L |
* +-O-+ +-I-+
* | |
* +-+---------+---+
* | rail net |
* +---------------+
*
* is converted into
* +----------+
* | |
* +---+ +-+-+ | +---+
* | | | L | A-L | | |
* | D1| | D | Proxy | | D2|
* | A | | A | | | |
* +-O-+ +-I-+ | +-I-+
* | | | |
* +-+---------+--+ +-+-----+-------+
* | rail net (A) | | rail net (L) |
* +--------------| +---------------+
*
* This works both analog to logic as well as logic to analog.
*
* The above is an advanced implementation of the existing discrete
* subsystem in MAME. Instead of relying on a fixed time-step, analog devices
* could either connect to fixed time-step clock or use an internal clock
* to update them. This would however introduce macro devices for RC, diodes
* and transistors again.
*
* ============================================================================
*
* Instead, the following approach in case of a pure terminal/input network
* is taken:
*
* +---+ +---+ +---+ +---+ +---+
* | | | | | | | | | |
* | D | | D | | D | | D | | D |
* | | | | | | | | | |
* +-T-+ +-I-+ +-I-+ +-T-+ +-T-+
* | | | | |
* '+' | | '-' '-'
* +-+---------+---------+---------+---------+-+
* | Calculated net |
* +-------------------------------------------+
*
* SPICE uses the following basic two terminal device:
*
* (k)
* +-----T-----+
* | | |
* | +--+--+ |
* | | | |
* | R | |
* | R | |
* | R I |
* | | I | Device n
* | V+ I |
* | V | |
* | V- | |
* | | | |
* | +--+--+ |
* | | |
* +-----T-----+
* (l)
*
* This is a resistance in series to a voltage source and paralleled by a
* current source. This is suitable to model voltage sources, current sources,
* resistors, capacitors, inductances and diodes.
*
* I(n,l) = - I(n,k) = ( V(k) - V - V(l) ) * (1/R(n)) + I(n)
*
* Now, the sum of all currents for a given net must be 0:
*
* Sum(n,I(n,l)) = 0 = sum(n, ( V(k) - V(n) - V(l) ) * (1/R(n)) + I(n) )
*
* With G(n) = 1 / R(n) and sum(n, G(n)) = Gtot and k=k(n)
*
* 0 = - V(l) * Gtot + sum(n, (V(k(n)) - V(n)) * G(n) + I(n))
*
* and with l=l(n) and fixed k
*
* 0 = -V(k) * Gtot + sum(n, ( V(l(n) + V(n) ) * G(n) - I(n))
*
* These equations represent a linear Matrix equation (with more math).
*
* In the end the solution of the analog subsystem boils down to
*
* (G - D) * V = I
*
* with G being the conductance matrix, D a diagonal matrix with the total
* conductance on the diagonal elements, V the net voltage vector and I the
* current vector.
*
* By using solely two terminal devices, we can simplify the whole calculation
* significantly. A BJT now is a four terminal device with two terminals being
* connected internally.
*
* The system is solved using an iterative approach:
*
* G * V - D * V = I
*
* assuming V=Vn=Vo
*
* Vn = D-1 * (I - G * Vo)
*
* Each terminal thus has three properties:
*
* a) Resistance
* b) Voltage source
* c) Current source/sink
*
* Going forward, the approach can be extended e.g. to use a linear
* equation solver.
*
* The formal representation of the circuit will stay the same, thus scales.
* \file nl_base.h
*
*/
@ -171,45 +25,92 @@
// Type definitions
// ----------------------------------------------------------------------------------------
/*! netlist_sig_t is the type used for logic signals. */
using netlist_sig_t = std::uint_least32_t;
//============================================================
// MACROS / New Syntax
//============================================================
//============================================================
// MACROS / New Syntax
//============================================================
/*! Construct a netlist device name */
#define NETLIB_NAME(chip) nld_ ## chip
#define NETLIB_OBJECT_DERIVED(name, pclass) \
class NETLIB_NAME(name) : public NETLIB_NAME(pclass)
/*! Start a netlist device class.
* Used to start defining a netlist device class.
* The simplest device without inputs or outputs would look like this:
*
* NETLIB_OBJECT(base_dummy)
* {
* public:
* NETLIB_CONSTRUCTOR(base_dummy) { }
* };
*
* Also refer to #NETLIB_CONSTRUCTOR.
*/
#define NETLIB_OBJECT(name) \
class NETLIB_NAME(name) : public device_t
#define NETLIB_CONSTRUCTOR_DERIVED(cname, pclass) \
private: family_setter_t m_famsetter; \
private: detail::family_setter_t m_famsetter; \
public: template <class CLASS> NETLIB_NAME(cname)(CLASS &owner, const pstring name) \
: NETLIB_NAME(pclass)(owner, name)
#define NETLIB_CONSTRUCTOR(cname) \
private: family_setter_t m_famsetter; \
/*! Used to define the constructor of a netlist device.
* Use this to define the constructor of a netlist device. Please refer to
* #NETLIB_OBJECT for an example.
*/
#define NETLIB_CONSTRUCTOR(cname) \
private: detail::family_setter_t m_famsetter; \
public: template <class CLASS> NETLIB_NAME(cname)(CLASS &owner, const pstring name) \
: device_t(owner, name)
/*! Used to define the destructor of a netlist device.
* The use of a destructor for netlist device should normally not be necessary.
*/
#define NETLIB_DESTRUCTOR(name) public: virtual ~NETLIB_NAME(name)()
#define NETLIB_CONSTRUCTOR_EX(cname, ...) \
private: family_setter_t m_famsetter; \
/*! Define an extended constructor and add further parameters to it.
* The macro allows to add further parameters to a device constructor. This is
* normally used for sub-devices and system devices only.
*/
#define NETLIB_CONSTRUCTOR_EX(cname, ...) \
private: detail::family_setter_t m_famsetter; \
public: template <class CLASS> NETLIB_NAME(cname)(CLASS &owner, const pstring name, __VA_ARGS__) \
: device_t(owner, name)
#define NETLIB_DYNAMIC() \
/*! Add this to a device definition to mark the device as dynamic.
* If this is added to device definition the device is treated as an analog
* dynamic device, i.e. #NETLIB_UPDATE_TERMINALSI is called on a each step
* of the Newton-Raphson step of solving the linear equations.
*/
#define NETLIB_DYNAMIC() \
public: virtual bool is_dynamic() const override { return true; }
#define NETLIB_TIMESTEP() \
/*! Add this to a device definition to mark the device as a time-stepping device
* and add code.
* If this is added to device definition the device is treated as an analog
* time-stepping device. Currently, only the capacitor device uses this. An other
* example would be an inductor device.
*
* Example:
*
* NETLIB_TIMESTEP()
* {
* // Gpar should support convergence
* const nl_double G = m_C.Value() / step + m_GParallel;
* const nl_double I = -G * deltaV();
* set(G, 0.0, I);
* }
*
*/
#define NETLIB_TIMESTEP() \
public: virtual bool is_timestep() const override { return true; } \
public: virtual void step_time(const nl_double step) override
#define NETLIB_UPDATE_AFTER_PARAM_CHANGE() \
#define NETLIB_UPDATE_AFTER_PARAM_CHANGE() \
public: virtual bool needs_update_after_param_change() const override { return true; }
#define NETLIB_FAMILY(family) , m_famsetter(*this, family)
@ -266,14 +167,33 @@ namespace netlist
class NETLIB_NAME(base_d_to_a_proxy);
}
namespace detail {
class object_t;
class device_object_t;
struct netlist_ref;
class core_terminal_t;
struct family_setter_t;
class queue_t;
class net_t;
}
//============================================================
// Exceptions
//============================================================
/*! Generic netlist expection.
* The exception is used in all events which are considered fatal.
*/
class nl_exception : public plib::pexception
{
public:
explicit nl_exception(const pstring text) : plib::pexception(text) { }
/*! Constructor.
* Allows a descriptive text to be assed to the exception
*/
explicit nl_exception(const pstring text //!< text to be passed
)
: plib::pexception(text) { }
/*! Copy constructor. */
nl_exception(const nl_exception &e) : plib::pexception(e) { }
virtual ~nl_exception() noexcept {}
};
@ -287,16 +207,15 @@ namespace netlist
class core_device_t;
class device_t;
// -----------------------------------------------------------------------------
// model_map_t
// -----------------------------------------------------------------------------
/*! Type of the model map used.
* This is used to hold all #Models in an unordered map
*/
using model_map_t = std::unordered_map<pstring, pstring>;
// -----------------------------------------------------------------------------
// logic_family_t
// -----------------------------------------------------------------------------
/*! Logic families descriptors are used create proxy devices.
* The logic family describe the analog capabilities of logic devices,
* inputs and outputs.
*/
class logic_family_desc_t
{
public:
@ -305,14 +224,25 @@ namespace netlist
virtual plib::owned_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_t &anetlist, const pstring &name,
logic_output_t *proxied) const = 0;
nl_double m_low_thresh_V;
nl_double m_high_thresh_V;
nl_double m_low_V;
nl_double m_high_V;
nl_double m_R_low;
nl_double m_R_high;
nl_double m_low_thresh_V; //!< low input threshhold. If the input voltage is below this value, a "0" input is signalled
nl_double m_high_thresh_V; //!< high input threshhold. If the input voltage is above this value, a "0" input is signalled
nl_double m_low_V; //!< low output voltage. This voltage is output if the ouput is "0"
nl_double m_high_V; //!< high output voltage. This voltage is output if the ouput is "1"
nl_double m_R_low; //!< low output resistance. Value of series resistor used for low output
nl_double m_R_high; //!< high output resistance. Value of series resistor used for high output
};
/*! Base class for devices, terminals, outputs and inputs which support
* logic families.
* This class is a storage container to store the logic family for a
* netlist object. You will not directly use it. Please refer to
* #NETLIB_FAMILY to learn how to define a logic family for a device.
*
* All terminals inherit the family description from the device
* The default is the ttl family, but any device can override the family.
* For individual terminals, the family can be overwritten as well.
*
*/
class logic_family_t
{
public:
@ -327,43 +257,58 @@ namespace netlist
const logic_family_desc_t *m_logic_family;
};
/* Terminals inherit the family description from the device
* The default is the ttl family, but any device can override the family.
* For individual terminals, these can be overwritten as well.
const logic_family_desc_t *family_TTL(); //*!< logic family for TTL devices.
const logic_family_desc_t *family_CD4XXX(); //*!< logic family for CD4XXX CMOS devices.
/*! A persistent variable template.
* Use the state_var template to define a variable whose value is saved.
* Within a device definition use
*
* Only devices of type GENERIC should have a family description entry
* NETLIB_OBJECT(abc)
* {
* NETLIB_CONSTRUCTOR(abc)
* , m_var(*this, "myvar", 0)
* ...
* state_var<unsigned> m_var;
* }
*/
const logic_family_desc_t *family_TTL();
const logic_family_desc_t *family_CD4XXX();
// -----------------------------------------------------------------------------
// State variables - use to preserve state
// -----------------------------------------------------------------------------
template <typename T>
struct state_var
{
public:
template <typename O>
state_var(O &owner, const pstring name, const T &value);
//! Constructor.
state_var(O &owner, //!< owner must have a netlist() method.
const pstring name, //!< identifier/name for this state variable
const T &value //!< Initial value after construction
);
//! Copy Constructor.
state_var(const state_var &rhs) NOEXCEPT = default;
//! Move Constructor.
state_var(state_var &&rhs) NOEXCEPT = default;
//! Assignment operator to assign value of a state var.
state_var &operator=(state_var rhs) { std::swap(rhs.m_value, this->m_value); return *this; }
//! Assignment operator to assign value of type T.
state_var &operator=(const T rhs) { m_value = rhs; return *this; }
//! Return value of state variable.
operator T & () { return m_value; }
//! Return value of state variable.
T & operator()() { return m_value; }
//! Return const value of state variable.
operator const T & () const { return m_value; }
//! Return const value of state variable.
const T & operator()() const { return m_value; }
T * ptr() { return &m_value; }
const T * ptr() const { return &m_value; }
private:
T m_value;
};
/*! A persistent array template.
* Use this state_var template to define an array whose contents are saved.
* Please refer to \ref state_var.
*/
template <typename T, std::size_t N>
struct state_var<T[N]>
{
@ -383,42 +328,55 @@ namespace netlist
// State variables - predefined and c++11 non-optioanl
// -----------------------------------------------------------------------------
/*! predefined state variable type for uint_fast8_t */
using state_var_u8 = state_var<std::uint_fast8_t>;
/*! predefined state variable type for int_fast8_t */
using state_var_s8 = state_var<std::int_fast8_t>;
/*! predefined state variable type for uint_fast32_t */
using state_var_u32 = state_var<std::uint_fast32_t>;
/*! predefined state variable type for int_fast32_t */
using state_var_s32 = state_var<std::int_fast32_t>;
// -----------------------------------------------------------------------------
// object_t
// -----------------------------------------------------------------------------
class object_t
/*! The base class for netlist devices, terminals and parameters.
*
* This class serves as the base class for all device, terminal and
* objects. It provides new and delete operators to supported e.g. pooled
* memory allocation to enhance locality. Please refer to \ref USE_MEMPOOL as
* well.
*/
class detail::object_t
{
P_PREVENT_COPYING(object_t)
public:
object_t(const pstring &aname);
/*! Constructor.
*
* Every class derived from the object_t class must have a name.
*/
object_t(const pstring &aname /*!< string containing name of the object */);
~object_t();
/*! return name of the object
*
* \returns name of the object.
*/
const pstring &name() const;
//netlist_t & m_netlist;
//netlist_t & netlist() { return m_netlist; }
//const netlist_t & netlist() const { return m_netlist; }
private:
pstring m_name;
public:
void * operator new (size_t size, void *ptr) { return ptr; }
void operator delete (void *ptr, void *) { }
void * operator new (size_t size);
void operator delete (void * mem);
private:
pstring m_name;
};
struct netlist_ref
struct detail::netlist_ref
{
netlist_ref(netlist_t &nl) : m_netlist(nl) { }
@ -434,28 +392,53 @@ namespace netlist
// device_object_t
// -----------------------------------------------------------------------------
class device_object_t : public object_t
/*! Base class for all objects being owned by a device.
*
* Serves as the base class of all objects being owned by a device.
*
*/
class detail::device_object_t : public detail::object_t
{
P_PREVENT_COPYING(device_object_t)
public:
/*! Enum specifying the type of object */
enum type_t {
TERMINAL = 0,
INPUT = 1,
OUTPUT = 2,
PARAM = 3,
TERMINAL = 0, /*!< object is an analog terminal */
INPUT = 1, /*!< object is an input */
OUTPUT = 2, /*!< object is an output */
PARAM = 3, /*!< object is a parameter */
};
device_object_t(core_device_t &dev, const pstring &aname, const type_t atype);
/*! Constructor.
*
* \param dev device owning the object.
* \param name string holding the name of the device
* \param type type of this object.
*/
device_object_t(core_device_t &dev, const pstring &name, const type_t type);
/*! returns reference to owning device.
* \returns reference to owning device.
*/
core_device_t &device() const { return m_device; }
/*! The object type.
* \returns type of the object
*/
type_t type() const { return m_type; }
bool is_type(const type_t atype) const { return (m_type == atype); }
/*! Checks if object is of specified type.
* \param type type to check object against.
* \returns true if object is of specified type else false.
*/
bool is_type(const type_t type) const { return (m_type == type); }
/*! The netlist owning the owner of this object.
* \returns reference to netlist object.
*/
netlist_t &netlist();
private:
core_device_t & m_device;
const type_t m_type;
const type_t m_type;
};
@ -463,7 +446,7 @@ namespace netlist
// core_terminal_t
// -----------------------------------------------------------------------------
class core_terminal_t : public device_object_t, public plib::linkedlist_t<core_terminal_t>::element_t
class detail::core_terminal_t : public device_object_t, public plib::linkedlist_t<core_terminal_t>::element_t
{
P_PREVENT_COPYING(core_terminal_t)
public:
@ -513,7 +496,7 @@ namespace netlist
// analog_t
// -----------------------------------------------------------------------------
class analog_t : public core_terminal_t
class analog_t : public detail::core_terminal_t
{
public:
@ -537,7 +520,7 @@ namespace netlist
terminal_t(core_device_t &dev, const pstring &aname);
terminal_t *m_otherterm;
nl_double operator ()() const;
void set(const nl_double G)
{
@ -570,6 +553,8 @@ namespace netlist
m_Idr1 = Idr;
}
terminal_t *m_otherterm;
private:
void set_ptr(nl_double *ptr, const nl_double val)
{
@ -590,7 +575,7 @@ namespace netlist
// logic_t
// -----------------------------------------------------------------------------
class logic_t : public core_terminal_t, public logic_family_t
class logic_t : public detail::core_terminal_t, public logic_family_t
{
public:
logic_t(core_device_t &dev, const pstring &aname, const type_t atype)
@ -623,6 +608,12 @@ namespace netlist
netlist_sig_t Q() const;
netlist_sig_t operator()() const
{
nl_assert(state() != STATE_INP_PASSIVE);
return Q();
}
void inactivate();
void activate();
void activate_hl();
@ -634,11 +625,27 @@ namespace netlist
// analog_input_t
// -----------------------------------------------------------------------------
/*! terminal providing analog input voltage.
*
* This terminal class provides a voltage measurement. The conductance against
* ground is infinite.
*/
class analog_input_t : public analog_t
{
public:
analog_input_t(core_device_t &dev, const pstring &aname);
/*! Constructor */
analog_input_t(core_device_t &dev, /*!< owning device */
const pstring &aname /*!< name of terminal */
);
/*! returns voltage at terminal.
* \returns voltage at terminal.
*/
nl_double operator()() const { return Q_Analog(); }
/*! returns voltage at terminal.
* \returns voltage at terminal.
*/
nl_double Q_Analog() const;
};
@ -647,7 +654,9 @@ namespace netlist
// net_t
// -----------------------------------------------------------------------------
class net_t : public object_t, public netlist_ref
class detail::net_t :
public detail::object_t,
public detail::netlist_ref
{
P_PREVENT_COPYING(net_t)
public:
@ -707,12 +716,12 @@ namespace netlist
};
class logic_net_t : public net_t
class logic_net_t : public detail::net_t
{
P_PREVENT_COPYING(logic_net_t)
public:
logic_net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr = nullptr);
logic_net_t(netlist_t &nl, const pstring &aname, detail::core_terminal_t *mr = nullptr);
virtual ~logic_net_t() { }
netlist_sig_t Q() const { return m_cur_Q; }
@ -748,14 +757,14 @@ namespace netlist
};
class analog_net_t : public net_t
class analog_net_t : public detail::net_t
{
P_PREVENT_COPYING(analog_net_t)
public:
using list_t = std::vector<analog_net_t *>;
analog_net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr = nullptr);
analog_net_t(netlist_t &nl, const pstring &aname, detail::core_terminal_t *mr = nullptr);
virtual ~analog_net_t() { }
@ -786,7 +795,7 @@ namespace netlist
void initial(const netlist_sig_t val);
void set_Q(const netlist_sig_t newQ, const netlist_time delay) NOEXCEPT
void push(const netlist_sig_t newQ, const netlist_time delay) NOEXCEPT
{
m_my_net.set_Q(newQ, delay); // take the shortcut
}
@ -799,13 +808,13 @@ namespace netlist
{
P_PREVENT_COPYING(analog_output_t)
public:
analog_output_t(core_device_t &dev, const pstring &aname);
void push(const nl_double val) { set_Q(val); }
void initial(const nl_double val);
void set_Q(const nl_double newQ);
private:
void set_Q(const nl_double newQ);
analog_net_t m_my_net;
};
@ -813,7 +822,7 @@ namespace netlist
// param_t
// -----------------------------------------------------------------------------
class param_t : public device_object_t
class param_t : public detail::device_object_t
{
P_PREVENT_COPYING(param_t)
public:
@ -842,13 +851,13 @@ namespace netlist
public:
param_template_t(device_t &device, const pstring name, const C val);
operator const C() const { return Value(); }
const C operator()() const { return Value(); }
void setTo(const C &param);
void initial(const C &val) { m_param = val; }
C Value() const { return m_param; }
protected:
C Value() const { return m_param; }
virtual void changed() { }
C m_param;
private:
@ -883,7 +892,10 @@ namespace netlist
// core_device_t
// -----------------------------------------------------------------------------
class core_device_t : public object_t, public logic_family_t, public netlist_ref
class core_device_t :
public detail::object_t,
public logic_family_t,
public detail::netlist_ref
{
P_PREVENT_COPYING(core_device_t)
public:
@ -929,18 +941,6 @@ namespace netlist
void do_reset() { reset(); }
void set_hint_deactivate(bool v) { m_hint_deactivate = v; }
netlist_sig_t INPLOGIC_PASSIVE(logic_input_t &inp);
netlist_sig_t INPLOGIC(const logic_input_t &inp) const
{
nl_assert(inp.state() != logic_t::STATE_INP_PASSIVE);
return inp.Q();
}
void OUTLOGIC(logic_output_t &out, const netlist_sig_t val, const netlist_time delay) NOEXCEPT;
nl_double INPANALOG(const analog_input_t &inp) const { return inp.Q_Analog(); }
nl_double TERMANALOG(const terminal_t &term) const { return term.net().Q_Analog(); }
void OUTANALOG(analog_output_t &out, const nl_double val) { out.set_Q(val); }
/* stats */
nperftime_t m_stat_total_time;
nperfcount_t m_stat_call_count;
@ -1001,12 +1001,12 @@ namespace netlist
}
#endif
void register_subalias(const pstring &name, core_terminal_t &term);
void register_subalias(const pstring &name, detail::core_terminal_t &term);
void register_subalias(const pstring &name, const pstring &aliased);
void connect_late(const pstring &t1, const pstring &t2);
void connect_late(core_terminal_t &t1, core_terminal_t &t2);
void connect_post_start(core_terminal_t &t1, core_terminal_t &t2);
void connect_late(detail::core_terminal_t &t1, detail::core_terminal_t &t2);
void connect_post_start(detail::core_terminal_t &t1, detail::core_terminal_t &t2);
protected:
NETLIB_UPDATEI() { }
@ -1019,7 +1019,7 @@ namespace netlist
// family_setter_t
// -----------------------------------------------------------------------------
struct family_setter_t
struct detail::family_setter_t
{
family_setter_t() { }
family_setter_t(core_device_t &dev, const char *desc);
@ -1040,10 +1040,11 @@ namespace netlist
// queue_t
// -----------------------------------------------------------------------------
class queue_t : public timed_queue<net_t *, netlist_time>,
public object_t,
public netlist_ref,
public plib::state_manager_t::callback_t
class detail::queue_t :
public timed_queue<net_t *, netlist_time>,
public detail::object_t,
public detail::netlist_ref,
public plib::state_manager_t::callback_t
{
public:
explicit queue_t(netlist_t &nl);
@ -1056,7 +1057,7 @@ namespace netlist
private:
struct names_t { char m_buf[64]; };
int m_qsize;
std::size_t m_qsize;
std::vector<netlist_time::internal_type> m_times;
std::vector<names_t> m_names;
};
@ -1068,7 +1069,6 @@ namespace netlist
class netlist_t : public plib::plog_dispatch_intf
{
friend class setup_t;
P_PREVENT_COPYING(netlist_t)
public:
@ -1080,15 +1080,15 @@ namespace netlist
void start();
void stop();
const queue_t &queue() const { return m_queue; }
queue_t &queue() { return m_queue; }
const detail::queue_t &queue() const { return m_queue; }
detail::queue_t &queue() { return m_queue; }
const netlist_time time() const { return m_time; }
devices::NETLIB_NAME(solver) *solver() const { return m_solver; }
devices::NETLIB_NAME(gnd) *gnd() const { return m_gnd; }
nl_double gmin() const;
void push_to_queue(net_t &out, const netlist_time attime) NOEXCEPT;
void remove_from_queue(net_t &out);
void push_to_queue(detail::net_t &out, const netlist_time attime) NOEXCEPT;
void remove_from_queue(detail::net_t &out);
void process_queue(const netlist_time &delta);
void abort_current_queue_slice() { m_queue.retime(m_time, nullptr); }
@ -1098,10 +1098,9 @@ namespace netlist
void set_setup(setup_t *asetup) { m_setup = asetup; }
setup_t &setup() { return *m_setup; }
void register_dev(plib::owned_ptr<device_t> dev);
net_t *find_net(const pstring &name);
detail::net_t *find_net(const pstring &name);
template<class device_class>
std::vector<device_class *> get_device_list()
@ -1143,7 +1142,7 @@ namespace netlist
{
this->state().save_item(static_cast<void *>(&owner), state, pstring(owner.name()) + "." + stname);
}
template<typename O, typename C> void save(O &owner, C *state, const pstring &stname, const int count)
template<typename O, typename C> void save(O &owner, C *state, const pstring &stname, const std::size_t count)
{
this->state().save_state_ptr(static_cast<void *>(&owner), pstring(owner.name()) + "." + stname, plib::state_manager_t::datatype_f<C>::f(), count, state);
}
@ -1154,21 +1153,18 @@ namespace netlist
void print_stats() const;
std::vector<plib::owned_ptr<core_device_t>> m_devices;
std::vector<plib::owned_ptr<core_device_t>> m_devices;
/* sole use is to manage lifetime of net objects */
std::vector<plib::owned_ptr<net_t>> m_nets;
std::vector<plib::owned_ptr<detail::net_t>> m_nets;
/* sole use is to manage lifetime of family objects */
std::vector<std::pair<pstring, std::unique_ptr<logic_family_desc_t>>> m_family_cache;
private:
plib::state_manager_t m_state;
plib::state_manager_t m_state;
/* mostly rw */
netlist_time m_time;
queue_t m_queue;
netlist_time m_time;
detail::queue_t m_queue;
nperftime_t m_stat_mainloop;
/* mostly ro */
devices::NETLIB_NAME(mainclock) * m_mainclock;
@ -1176,15 +1172,16 @@ namespace netlist
devices::NETLIB_NAME(gnd) * m_gnd;
devices::NETLIB_NAME(netlistparams) *m_params;
pstring m_name;
setup_t *m_setup;
plib::plog_base<NL_DEBUG> m_log;
plib::dynlib *m_lib; // external lib needs to be loaded as long as netlist exists
pstring m_name;
setup_t * m_setup;
plib::plog_base<NL_DEBUG> m_log;
plib::dynlib * m_lib; // external lib needs to be loaded as long as netlist exists
// performance
nperfcount_t m_perf_out_processed;
nperfcount_t m_perf_inp_processed;
nperfcount_t m_perf_inp_active;
nperftime_t m_stat_mainloop;
nperfcount_t m_perf_out_processed;
nperfcount_t m_perf_inp_processed;
nperfcount_t m_perf_inp_active;
};
// -----------------------------------------------------------------------------
@ -1223,22 +1220,22 @@ namespace netlist
}
}
inline bool core_terminal_t::is_logic() const
inline bool detail::core_terminal_t::is_logic() const
{
return dynamic_cast<const logic_t *>(this) != nullptr;
}
inline bool core_terminal_t::is_analog() const
inline bool detail::core_terminal_t::is_analog() const
{
return dynamic_cast<const analog_t *>(this) != nullptr;
}
inline bool net_t::is_logic() const
inline bool detail::net_t::is_logic() const
{
return dynamic_cast<const logic_net_t *>(this) != nullptr;
}
inline bool net_t::is_analog() const
inline bool detail::net_t::is_analog() const
{
return dynamic_cast<const analog_net_t *>(this) != nullptr;
}
@ -1279,7 +1276,7 @@ namespace netlist
}
}
inline void net_t::push_to_queue(const netlist_time delay) NOEXCEPT
inline void detail::net_t::push_to_queue(const netlist_time delay) NOEXCEPT
{
if (!is_queued() && (num_cons() != 0))
{
@ -1292,7 +1289,7 @@ namespace netlist
}
}
inline void net_t::reschedule_in_queue(const netlist_time delay) NOEXCEPT
inline void detail::net_t::reschedule_in_queue(const netlist_time delay) NOEXCEPT
{
if (is_queued())
netlist().remove_from_queue(*this);
@ -1315,6 +1312,8 @@ namespace netlist
return static_cast<analog_net_t &>(core_terminal_t::net());
}
inline nl_double terminal_t::operator ()() const { return net().Q_Analog(); }
inline logic_net_t & logic_t::net()
{
return *static_cast<logic_net_t *>(&core_terminal_t::net());
@ -1345,21 +1344,16 @@ namespace netlist
}
}
inline void netlist_t::push_to_queue(net_t &out, const netlist_time attime) NOEXCEPT
inline void netlist_t::push_to_queue(detail::net_t &out, const netlist_time attime) NOEXCEPT
{
m_queue.push(attime, &out);
}
inline void netlist_t::remove_from_queue(net_t &out)
inline void netlist_t::remove_from_queue(detail::net_t &out)
{
m_queue.remove(&out);
}
inline void core_device_t::OUTLOGIC(logic_output_t &out, const netlist_sig_t val, const netlist_time delay) NOEXCEPT
{
out.set_Q(val, delay);
}
template <typename T>
template <typename O>
state_var<T>::state_var(O &owner, const pstring name, const T &value)
@ -1376,7 +1370,7 @@ namespace netlist
m_value[i] = value;
}
inline netlist_t &device_object_t::netlist()
inline netlist_t &detail::device_object_t::netlist()
{
return m_device.netlist();
}

View File

@ -1,7 +1,8 @@
// license:GPL-2.0+
// copyright-holders:Couriersud
/*
* nlconfig.h
/*!
*
* \file nl_config.h
*
*/
@ -75,7 +76,15 @@
// GENERAL
//============================================================
#define NL_USE_MEMPOOL (0)
/*! Make use of a memory pool for performance related objects.
*
* Set to 1 to compile netlist with memory allocations from a
* linear memory pool. This is based of the assumption that
* due to enhanced locality there will be less cache misses.
* Your mileage may vary.
*
*/
#define USE_MEMPOOL (1)
#define USE_TRUTHTABLE (1)
//============================================================

View File

@ -230,7 +230,7 @@ inline int CAPACITOR_tc_lh(const double c, const double r)
NET_C(GND, name ## _C.2)
#else
// fast, might work
#define CHIP_CAPACITOR(name, pdesc) \
#define CHIP_CAPACITOR(name, pdesc) \
RES(name ## _C, RES_K(1000)) \
ALIAS(name.1, name ## _C.1 ) \
ALIAS(name.2, name ## _C.1) \

View File

@ -53,10 +53,12 @@ void factory_list_t::error(const pstring &s)
base_factory_t * factory_list_t::factory_by_name(const pstring &devname)
{
for (auto & e : *this)
{
if (e->name() == devname)
return e.get();
}
m_setup.log().fatal("Class {1} not found!\n", devname);
m_setup.log().fatal("Class <{1}> not found!\n", devname);
return nullptr; // appease code analysis
}

View File

@ -117,7 +117,7 @@ namespace netlist
// save state support & mame disasm
const entry_t *listptr() const { return &m_list[1]; }
std::size_t size() const { return m_end - &m_list[1]; }
std::size_t size() const { return static_cast<std::size_t>(m_end - &m_list[1]); }
const entry_t & operator[](const std::size_t index) const { return m_list[ 1 + index]; }
private:

View File

@ -152,9 +152,9 @@ void parser_t::net_truthtable_start()
{
pstring name = get_identifier();
require_token(m_tok_comma);
unsigned ni = get_number_long();
long ni = get_number_long();
require_token(m_tok_comma);
unsigned no = get_number_long();
long no = get_number_long();
require_token(m_tok_comma);
pstring def_param = get_string();
require_token(m_tok_param_right);
@ -162,8 +162,8 @@ void parser_t::net_truthtable_start()
netlist::tt_desc desc;
desc.classname = name;
desc.name = name;
desc.ni = ni;
desc.no = no;
desc.ni = static_cast<unsigned long>(ni);
desc.no = static_cast<unsigned long>(no);
desc.def_param = "+" + def_param;
desc.family = "";
@ -317,8 +317,8 @@ void parser_t::dippins()
}
if ((pins.size() % 2) == 1)
error("You must pass an equal number of pins to DIPPINS");
unsigned n = pins.size();
for (unsigned i = 0; i < n / 2; i++)
std::size_t n = pins.size();
for (std::size_t i = 0; i < n / 2; i++)
{
m_setup.register_alias(plib::pfmt("{1}")(i+1), pins[i*2]);
m_setup.register_alias(plib::pfmt("{1}")(n-i), pins[i*2 + 1]);

View File

@ -138,8 +138,8 @@ bool setup_t::device_exists(const pstring name) const
void setup_t::register_model(const pstring &model_in)
{
int pos = model_in.find(" ");
if (pos < 0)
auto pos = model_in.find(" ");
if (pos == model_in.end())
log().fatal("Unable to parse model: {1}", model_in);
pstring model = model_in.left(pos).trim().ucase();
pstring def = model_in.substr(pos + 1).trim();
@ -165,15 +165,15 @@ void setup_t::register_dippins_arr(const pstring &terms)
plib::pstring_vector_t list(terms,", ");
if (list.size() == 0 || (list.size() % 2) == 1)
log().fatal("You must pass an equal number of pins to DIPPINS");
unsigned n = list.size();
for (unsigned i = 0; i < n / 2; i++)
std::size_t n = list.size();
for (std::size_t i = 0; i < n / 2; i++)
{
register_alias(plib::pfmt("{1}")(i+1), list[i * 2]);
register_alias(plib::pfmt("{1}")(n-i), list[i * 2 + 1]);
}
}
pstring setup_t::objtype_as_str(device_object_t &in) const
pstring setup_t::objtype_as_str(detail::device_object_t &in) const
{
switch (in.type())
{
@ -187,7 +187,7 @@ pstring setup_t::objtype_as_str(device_object_t &in) const
return "PARAM";
}
// FIXME: noreturn
log().fatal("Unknown object type {1}\n", (unsigned) in.type());
log().fatal("Unknown object type {1}\n", static_cast<unsigned>(in.type()));
return "Error";
}
@ -214,7 +214,7 @@ void setup_t::register_and_set_param(pstring name, param_t &param)
double vald = 0;
if (sscanf(val.cstr(), "%lf", &vald) != 1)
log().fatal("Invalid number conversion {1} : {2}\n", name, val);
static_cast<param_int_t &>(param).initial((int) vald);
static_cast<param_int_t &>(param).initial(static_cast<int>(vald));
}
break;
case param_t::STRING:
@ -224,14 +224,14 @@ void setup_t::register_and_set_param(pstring name, param_t &param)
}
break;
//default:
// log().fatal("Parameter is not supported {1} : {2}\n", name, val);
// log().fatal("Parameter is not supported {1} : {2}\n", name, val);
}
}
if (!m_params.insert({param.name(), param_ref_t(param.name(), param.device(), param)}).second)
log().fatal("Error adding parameter {1} to parameter list\n", name);
}
void setup_t::register_term(core_terminal_t &term)
void setup_t::register_term(detail::core_terminal_t &term)
{
if (!m_terminals.insert({term.name(), &term}).second)
log().fatal("Error adding {1} {2} to terminal list\n", objtype_as_str(term), term.name());
@ -351,7 +351,7 @@ const pstring setup_t::resolve_alias(const pstring &name) const
return ret;
}
core_terminal_t *setup_t::find_terminal(const pstring &terminal_in, bool required)
detail::core_terminal_t *setup_t::find_terminal(const pstring &terminal_in, bool required)
{
const pstring &tname = resolve_alias(terminal_in);
auto ret = m_terminals.find(tname);
@ -362,7 +362,7 @@ core_terminal_t *setup_t::find_terminal(const pstring &terminal_in, bool require
ret = m_terminals.find(tname + ".Q");
}
core_terminal_t *term = (ret == m_terminals.end() ? nullptr : ret->second);
detail::core_terminal_t *term = (ret == m_terminals.end() ? nullptr : ret->second);
if (term == nullptr && required)
log().fatal("terminal {1}({2}) not found!\n", terminal_in, tname);
@ -371,12 +371,13 @@ core_terminal_t *setup_t::find_terminal(const pstring &terminal_in, bool require
return term;
}
core_terminal_t *setup_t::find_terminal(const pstring &terminal_in, device_object_t::type_t atype, bool required)
detail::core_terminal_t *setup_t::find_terminal(const pstring &terminal_in,
detail::device_object_t::type_t atype, bool required)
{
const pstring &tname = resolve_alias(terminal_in);
auto ret = m_terminals.find(tname);
/* look for default */
if (ret == m_terminals.end() && atype == device_object_t::OUTPUT)
if (ret == m_terminals.end() && atype == detail::device_object_t::OUTPUT)
{
/* look for ".Q" std output */
ret = m_terminals.find(tname + ".Q");
@ -384,7 +385,7 @@ core_terminal_t *setup_t::find_terminal(const pstring &terminal_in, device_objec
if (ret == m_terminals.end() && required)
log().fatal("terminal {1}({2}) not found!\n", terminal_in, tname);
core_terminal_t *term = (ret == m_terminals.end() ? nullptr : ret->second);
detail::core_terminal_t *term = (ret == m_terminals.end() ? nullptr : ret->second);
if (term != nullptr && term->type() != atype)
{
@ -413,7 +414,7 @@ param_t *setup_t::find_param(const pstring &param_in, bool required) const
}
// FIXME avoid dynamic cast here
devices::nld_base_proxy *setup_t::get_d_a_proxy(core_terminal_t &out)
devices::nld_base_proxy *setup_t::get_d_a_proxy(detail::core_terminal_t &out)
{
nl_assert(out.is_logic());
@ -450,7 +451,7 @@ devices::nld_base_proxy *setup_t::get_d_a_proxy(core_terminal_t &out)
return proxy;
}
void setup_t::connect_input_output(core_terminal_t &in, core_terminal_t &out)
void setup_t::connect_input_output(detail::core_terminal_t &in, detail::core_terminal_t &out)
{
if (out.is_analog() && in.is_logic())
{
@ -483,7 +484,7 @@ void setup_t::connect_input_output(core_terminal_t &in, core_terminal_t &out)
}
void setup_t::connect_terminal_input(terminal_t &term, core_terminal_t &inp)
void setup_t::connect_terminal_input(terminal_t &term, detail::core_terminal_t &inp)
{
if (inp.is_analog())
{
@ -514,7 +515,7 @@ void setup_t::connect_terminal_input(terminal_t &term, core_terminal_t &inp)
}
}
void setup_t::connect_terminal_output(terminal_t &in, core_terminal_t &out)
void setup_t::connect_terminal_output(terminal_t &in, detail::core_terminal_t &out)
{
if (out.is_analog())
{
@ -538,7 +539,7 @@ void setup_t::connect_terminal_output(terminal_t &in, core_terminal_t &out)
}
}
void setup_t::connect_terminals(core_terminal_t &t1, core_terminal_t &t2)
void setup_t::connect_terminals(detail::core_terminal_t &t1, detail::core_terminal_t &t2)
{
if (t1.has_net() && t2.has_net())
{
@ -566,7 +567,7 @@ void setup_t::connect_terminals(core_terminal_t &t1, core_terminal_t &t2)
}
}
static core_terminal_t &resolve_proxy(core_terminal_t &term)
static detail::core_terminal_t &resolve_proxy(detail::core_terminal_t &term)
{
if (term.is_logic())
{
@ -577,7 +578,7 @@ static core_terminal_t &resolve_proxy(core_terminal_t &term)
return term;
}
bool setup_t::connect_input_input(core_terminal_t &t1, core_terminal_t &t2)
bool setup_t::connect_input_input(detail::core_terminal_t &t1, detail::core_terminal_t &t2)
{
bool ret = false;
if (t1.has_net())
@ -588,7 +589,7 @@ bool setup_t::connect_input_input(core_terminal_t &t1, core_terminal_t &t2)
{
for (auto & t : t1.net().m_core_terms)
{
if (t->is_type(core_terminal_t::TERMINAL))
if (t->is_type(detail::core_terminal_t::TERMINAL))
ret = connect(t2, *t);
if (ret)
break;
@ -603,7 +604,7 @@ bool setup_t::connect_input_input(core_terminal_t &t1, core_terminal_t &t2)
{
for (auto & t : t2.net().m_core_terms)
{
if (t->is_type(core_terminal_t::TERMINAL))
if (t->is_type(detail::core_terminal_t::TERMINAL))
ret = connect(t1, *t);
if (ret)
break;
@ -615,46 +616,46 @@ bool setup_t::connect_input_input(core_terminal_t &t1, core_terminal_t &t2)
bool setup_t::connect(core_terminal_t &t1_in, core_terminal_t &t2_in)
bool setup_t::connect(detail::core_terminal_t &t1_in, detail::core_terminal_t &t2_in)
{
log().debug("Connecting {1} to {2}\n", t1_in.name(), t2_in.name());
core_terminal_t &t1 = resolve_proxy(t1_in);
core_terminal_t &t2 = resolve_proxy(t2_in);
detail::core_terminal_t &t1 = resolve_proxy(t1_in);
detail::core_terminal_t &t2 = resolve_proxy(t2_in);
bool ret = true;
if (t1.is_type(core_terminal_t::OUTPUT) && t2.is_type(core_terminal_t::INPUT))
if (t1.is_type(detail::core_terminal_t::OUTPUT) && t2.is_type(detail::core_terminal_t::INPUT))
{
if (t2.has_net() && t2.net().isRailNet())
log().fatal("Input {1} already connected\n", t2.name());
connect_input_output(t2, t1);
}
else if (t1.is_type(core_terminal_t::INPUT) && t2.is_type(core_terminal_t::OUTPUT))
else if (t1.is_type(detail::core_terminal_t::INPUT) && t2.is_type(detail::core_terminal_t::OUTPUT))
{
if (t1.has_net() && t1.net().isRailNet())
log().fatal("Input {1} already connected\n", t1.name());
connect_input_output(t1, t2);
}
else if (t1.is_type(core_terminal_t::OUTPUT) && t2.is_type(core_terminal_t::TERMINAL))
else if (t1.is_type(detail::core_terminal_t::OUTPUT) && t2.is_type(detail::core_terminal_t::TERMINAL))
{
connect_terminal_output(dynamic_cast<terminal_t &>(t2), t1);
}
else if (t1.is_type(core_terminal_t::TERMINAL) && t2.is_type(core_terminal_t::OUTPUT))
else if (t1.is_type(detail::core_terminal_t::TERMINAL) && t2.is_type(detail::core_terminal_t::OUTPUT))
{
connect_terminal_output(dynamic_cast<terminal_t &>(t1), t2);
}
else if (t1.is_type(core_terminal_t::INPUT) && t2.is_type(core_terminal_t::TERMINAL))
else if (t1.is_type(detail::core_terminal_t::INPUT) && t2.is_type(detail::core_terminal_t::TERMINAL))
{
connect_terminal_input(dynamic_cast<terminal_t &>(t2), t1);
}
else if (t1.is_type(core_terminal_t::TERMINAL) && t2.is_type(core_terminal_t::INPUT))
else if (t1.is_type(detail::core_terminal_t::TERMINAL) && t2.is_type(detail::core_terminal_t::INPUT))
{
connect_terminal_input(dynamic_cast<terminal_t &>(t1), t2);
}
else if (t1.is_type(core_terminal_t::TERMINAL) && t2.is_type(core_terminal_t::TERMINAL))
else if (t1.is_type(detail::core_terminal_t::TERMINAL) && t2.is_type(detail::core_terminal_t::TERMINAL))
{
connect_terminals(dynamic_cast<terminal_t &>(t1), dynamic_cast<terminal_t &>(t2));
}
else if (t1.is_type(core_terminal_t::INPUT) && t2.is_type(core_terminal_t::INPUT))
else if (t1.is_type(detail::core_terminal_t::INPUT) && t2.is_type(detail::core_terminal_t::INPUT))
{
ret = connect_input_input(t1, t2);
}
@ -682,8 +683,8 @@ void setup_t::resolve_inputs()
{
const pstring t1s = li->first;
const pstring t2s = li->second;
core_terminal_t *t1 = find_terminal(t1s);
core_terminal_t *t2 = find_terminal(t2s);
detail::core_terminal_t *t1 = find_terminal(t1s);
detail::core_terminal_t *t2 = find_terminal(t2s);
if (connect(*t1, *t2))
li = m_links.erase(li);
@ -720,7 +721,7 @@ void setup_t::resolve_inputs()
log().verbose("looking for terminals not connected ...");
for (auto & i : m_terminals)
{
core_terminal_t *term = i.second;
detail::core_terminal_t *term = i.second;
if (!term->has_net() && dynamic_cast< devices::NETLIB_NAME(dummy_input) *>(&term->device()) != nullptr)
log().warning("Found dummy terminal {1} without connections", term->name());
else if (!term->has_net())
@ -777,61 +778,7 @@ void setup_t::start_devices()
}
}
/* make sure the solver and parameters are started first! */
for (auto & e : m_device_factory)
{
if ( factory().is_class<devices::NETLIB_NAME(mainclock)>(e.second)
|| factory().is_class<devices::NETLIB_NAME(solver)>(e.second)
|| factory().is_class<devices::NETLIB_NAME(gnd)>(e.second)
|| factory().is_class<devices::NETLIB_NAME(netlistparams)>(e.second))
{
auto dev = plib::owned_ptr<device_t>(e.second->Create(netlist(), e.first));
netlist().register_dev(std::move(dev));
}
}
log().debug("Searching for mainclock and solver ...\n");
netlist().m_mainclock = netlist().get_single_device<devices::NETLIB_NAME(mainclock)>("mainclock");
netlist().m_solver = netlist().get_single_device<devices::NETLIB_NAME(solver)>("solver");
netlist().m_gnd = netlist().get_single_device<devices::NETLIB_NAME(gnd)>("gnd");
netlist().m_params = netlist().get_single_device<devices::NETLIB_NAME(netlistparams)>("parameter");
/* create devices */
for (auto & e : m_device_factory)
{
if ( !factory().is_class<devices::NETLIB_NAME(mainclock)>(e.second)
&& !factory().is_class<devices::NETLIB_NAME(solver)>(e.second)
&& !factory().is_class<devices::NETLIB_NAME(gnd)>(e.second)
&& !factory().is_class<devices::NETLIB_NAME(netlistparams)>(e.second))
{
auto dev = plib::owned_ptr<device_t>(e.second->Create(netlist(), e.first));
netlist().register_dev(std::move(dev));
}
}
bool use_deactivate = (netlist().m_params->m_use_deactivate.Value() ? true : false);
for (auto &d : netlist().m_devices)
{
if (use_deactivate)
{
auto p = m_param_values.find(d->name() + ".HINT_NO_DEACTIVATE");
if (p != m_param_values.end())
{
//FIXME: Error checking
auto v = p->second.as_long();
d->set_hint_deactivate(!v);
}
}
else
d->set_hint_deactivate(false);
}
netlist().start();
}
plib::plog_base<NL_DEBUG> &setup_t::log()
@ -901,13 +848,13 @@ static pstring model_string(model_map_t &map)
void setup_t::model_parse(const pstring &model_in, model_map_t &map)
{
pstring model = model_in;
int pos = 0;
pstring::iterator pos(nullptr);
pstring key;
while (true)
{
pos = model.find("(");
if (pos >= 0) break;
if (pos != model.end()) break;
key = model.ucase();
auto i = m_models.find(key);
@ -931,13 +878,14 @@ void setup_t::model_parse(const pstring &model_in, model_map_t &map)
pstring remainder=model.substr(pos+1).trim();
if (!remainder.endsWith(")"))
log().fatal("Model error {1}\n", model);
remainder = remainder.left(remainder.len() - 1);
// FIMXE: Not optimal
remainder = remainder.left(remainder.begin() + (remainder.len() - 1));
plib::pstring_vector_t pairs(remainder," ", true);
for (pstring &pe : pairs)
{
int pose = pe.find("=");
if (pose < 0)
auto pose = pe.find("=");
if (pose == pe.end())
log().fatal("Model error on pair {1}\n", model);
map[pe.left(pose).ucase()] = pe.substr(pose+1);
}
@ -962,8 +910,8 @@ nl_double setup_t::model_value(model_map_t &map, const pstring &entity)
pstring tmp = model_value_str(map, entity);
nl_double factor = NL_FCONST(1.0);
pstring numfac = tmp.right(1);
switch (numfac.code_at(0))
auto p = tmp.begin() + (tmp.len() - 1);
switch (*p)
{
case 'M': factor = 1e6; break;
case 'k': factor = 1e3; break;
@ -974,11 +922,11 @@ nl_double setup_t::model_value(model_map_t &map, const pstring &entity)
case 'f': factor = 1e-15; break;
case 'a': factor = 1e-18; break;
default:
if (numfac < "0" || numfac > "9")
nl_exception(plib::pfmt("Unknown number factor <{1}> in: {2}")(numfac)(entity));
if (*p < '0' || *p > '9')
nl_exception(plib::pfmt("Unknown number factor in: {1}")(entity));
}
if (factor != NL_FCONST(1.0))
tmp = tmp.left(tmp.len() - 1);
tmp = tmp.left(tmp.begin() + (tmp.len() - 1));
return tmp.as_double() * factor;
}
@ -1013,7 +961,7 @@ bool setup_t::parse_stream(plib::pistream &istrm, const pstring &name)
void setup_t::register_define(pstring defstr)
{
auto p = defstr.find("=");
if (p>0)
if (p != defstr.end())
register_define(defstr.left(p), defstr.substr(p+1));
else
register_define(defstr, "1");

View File

@ -120,8 +120,8 @@ namespace netlist
{
pstring name;
pstring classname;
unsigned ni;
unsigned no;
unsigned long ni;
unsigned long no;
pstring def_param;
plib::pstring_vector_t desc;
pstring family;
@ -184,7 +184,7 @@ namespace netlist
void register_and_set_param(pstring name, param_t &param);
void register_term(core_terminal_t &obj);
void register_term(detail::core_terminal_t &obj);
void register_dev(const pstring &classname, const pstring &name);
@ -207,7 +207,7 @@ namespace netlist
void remove_connections(const pstring attach);
bool connect(core_terminal_t &t1, core_terminal_t &t2);
bool connect(detail::core_terminal_t &t1, detail::core_terminal_t &t2);
bool device_exists(const pstring name) const;
@ -250,11 +250,6 @@ namespace netlist
void model_parse(const pstring &model, model_map_t &map);
plib::plog_base<NL_DEBUG> &log();
const plib::plog_base<NL_DEBUG> &log() const;
std::vector<std::pair<pstring, base_factory_t *>> m_device_factory;
/* FIXME: truth table trampoline */
void tt_factory_create(tt_desc &desc);
@ -262,47 +257,44 @@ namespace netlist
/* helper - also used by nltool */
const pstring resolve_alias(const pstring &name) const;
protected:
plib::plog_base<NL_DEBUG> &log();
const plib::plog_base<NL_DEBUG> &log() const;
std::vector<std::pair<pstring, base_factory_t *>> m_device_factory;
std::unordered_map<pstring, pstring> m_alias;
std::unordered_map<pstring, pstring> m_param_values;
std::unordered_map<pstring, detail::core_terminal_t *> m_terminals;
private:
core_terminal_t *find_terminal(const pstring &outname_in, bool required = true);
core_terminal_t *find_terminal(const pstring &outname_in, device_object_t::type_t atype, bool required = true);
detail::core_terminal_t *find_terminal(const pstring &outname_in, bool required = true);
detail::core_terminal_t *find_terminal(const pstring &outname_in, detail::device_object_t::type_t atype, bool required = true);
void connect_terminals(core_terminal_t &in, core_terminal_t &out);
void connect_input_output(core_terminal_t &in, core_terminal_t &out);
void connect_terminal_output(terminal_t &in, core_terminal_t &out);
void connect_terminal_input(terminal_t &term, core_terminal_t &inp);
bool connect_input_input(core_terminal_t &t1, core_terminal_t &t2);
void connect_terminals(detail::core_terminal_t &in, detail::core_terminal_t &out);
void connect_input_output(detail::core_terminal_t &in, detail::core_terminal_t &out);
void connect_terminal_output(terminal_t &in, detail::core_terminal_t &out);
void connect_terminal_input(terminal_t &term, detail::core_terminal_t &inp);
bool connect_input_input(detail::core_terminal_t &t1, detail::core_terminal_t &t2);
// helpers
pstring objtype_as_str(device_object_t &in) const;
pstring objtype_as_str(detail::device_object_t &in) const;
devices::nld_base_proxy *get_d_a_proxy(core_terminal_t &out);
devices::nld_base_proxy *get_d_a_proxy(detail::core_terminal_t &out);
netlist_t &m_netlist;
netlist_t &m_netlist;
std::unordered_map<pstring, param_ref_t> m_params;
std::vector<link_t> m_links;
factory_list_t m_factory;
std::unordered_map<pstring, pstring> m_models;
public:
std::unordered_map<pstring, pstring> m_alias;
std::unordered_map<pstring, param_ref_t> m_params;
std::unordered_map<pstring, pstring> m_param_values;
std::unordered_map<pstring, core_terminal_t *> m_terminals;
private:
std::vector<link_t> m_links;
factory_list_t m_factory;
std::unordered_map<pstring, pstring> m_models;
int m_proxy_cnt;
int m_frontier_cnt;
std::stack<pstring> m_namespace_stack;
source_t::list_t m_sources;
std::vector<plib::ppreprocessor::define_t> m_defines;
std::vector<pstring> m_lib;
std::stack<pstring> m_namespace_stack;
source_t::list_t m_sources;
std::vector<plib::ppreprocessor::define_t> m_defines;
std::vector<pstring> m_lib;
unsigned m_proxy_cnt;
unsigned m_frontier_cnt;
};
// ----------------------------------------------------------------------------------------

View File

@ -104,7 +104,8 @@ namespace netlist
}
constexpr internal_type as_raw() const { return m_time; }
constexpr double as_double() const { return (double) m_time / (double) resolution; }
constexpr double as_double() const { return static_cast<double>(m_time)
/ static_cast<double>(resolution); }
// for save states ....
internal_type *get_internaltype_ptr() { return &m_time; }
@ -114,7 +115,7 @@ namespace netlist
static constexpr ptime from_msec(const internal_type ms) { return ptime(ms, UINT64_C(1000)); }
static constexpr ptime from_hz(const internal_type hz) { return ptime(1 , hz); }
static constexpr ptime from_raw(const internal_type raw) { return ptime(raw, resolution); }
static constexpr ptime from_double(const double t) { return ptime((internal_type) ( t * (double) resolution), resolution); }
static constexpr ptime from_double(const double t) { return ptime(static_cast<internal_type>( t * static_cast<double>(resolution)), resolution); }
static constexpr ptime zero() { return ptime(0, resolution); }
static constexpr ptime quantum() { return ptime(1, resolution); }

View File

@ -12,7 +12,6 @@
#include "pfmtlog.h"
namespace plib {
//============================================================
// Exceptions
//============================================================
@ -56,7 +55,7 @@ out_of_mem_e::out_of_mem_e(const pstring &location)
// Memory pool
//============================================================
mempool::mempool(int min_alloc, int min_align)
mempool::mempool(size_t min_alloc, size_t min_align)
: m_min_alloc(min_alloc), m_min_align(min_align)
{
}
@ -71,7 +70,7 @@ mempool::~mempool()
m_blocks.clear();
}
int mempool::new_block()
size_t mempool::new_block()
{
block b;
b.data = new char[m_min_alloc];
@ -93,21 +92,21 @@ void *mempool::alloc(size_t size)
{
b.m_free -= rs;
b.m_num_alloc++;
info *i = (info *) b.cur_ptr;
auto i = reinterpret_cast<info *>(b.cur_ptr);
i->m_block = bn;
void *ret = (void *) (b.cur_ptr + sizeof(info));
auto ret = reinterpret_cast<void *>(b.cur_ptr + sizeof(info));
b.cur_ptr += rs;
return ret;
}
}
{
int bn = new_block();
size_t bn = new_block();
auto &b = m_blocks[bn];
b.m_num_alloc = 1;
b.m_free = m_min_alloc - rs;
info *i = (info *) b.cur_ptr;
auto i = reinterpret_cast<info *>(b.cur_ptr);
i->m_block = bn;
void *ret = (void *) (b.cur_ptr + sizeof(info));
auto ret = reinterpret_cast<void *>(b.cur_ptr + sizeof(info));
b.cur_ptr += rs;
return ret;
}
@ -115,9 +114,9 @@ void *mempool::alloc(size_t size)
void mempool::free(void *ptr)
{
char *p = (char *) ptr;
auto p = reinterpret_cast<char *>(ptr);
info *i = (info *) (p - sizeof(info));
auto i = reinterpret_cast<info *>(p - sizeof(info));
block *b = &m_blocks[i->m_block];
if (b->m_num_alloc == 0)
fprintf(stderr, "Argh .. double free\n");

View File

@ -17,7 +17,6 @@
#include "pstring.h"
namespace plib {
//============================================================
// exception base
//============================================================
@ -204,7 +203,7 @@ private:
char *data;
};
int new_block();
size_t new_block();
struct info
{
@ -213,14 +212,14 @@ private:
};
public:
mempool(int min_alloc, int min_align);
mempool(size_t min_alloc, size_t min_align);
~mempool();
void *alloc(size_t size);
void free(void *ptr);
int m_min_alloc;
int m_min_align;
size_t m_min_alloc;
size_t m_min_align;
std::vector<block> m_blocks;
};

View File

@ -183,7 +183,8 @@ namespace chrono {
type total() const { return m_time; }
ctype count() const { return m_count; }
double as_seconds() const { return (double) total() / (double) T::per_second(); }
double as_seconds() const { return static_cast<double>(total())
/ static_cast<double>(T::per_second()); }
constexpr static bool enabled = enabled_;
private:

View File

@ -20,7 +20,7 @@ namespace plib {
pfmt::pfmt(const pstring &fmt)
: m_str(m_str_buf), m_allocated(0), m_arg(0)
{
unsigned l = fmt.blen() + 1;
std::size_t l = fmt.blen() + 1;
if (l>sizeof(m_str_buf))
{
m_allocated = 2 * l;
@ -32,7 +32,7 @@ pfmt::pfmt(const pstring &fmt)
pfmt::pfmt(const char *fmt)
: m_str(m_str_buf), m_allocated(0), m_arg(0)
{
unsigned l = strlen(fmt) + 1;
std::size_t l = strlen(fmt) + 1;
if (l>sizeof(m_str_buf))
{
m_allocated = 2 * l;
@ -55,11 +55,11 @@ void pfmt::format_element(const char *f, const char *l, const char *fmt_spec, .
char search[10] = "";
char buf[2048];
m_arg++;
int sl = sprintf(search, "{%d:", m_arg);
std::size_t sl = static_cast<std::size_t>(sprintf(search, "{%d:", m_arg));
char *p = strstr(m_str, search);
if (p == nullptr)
{
sl = sprintf(search, "{%d}", m_arg);
sl = static_cast<std::size_t>(sprintf(search, "{%d}", m_arg));
p = strstr(m_str, search);
if (p == nullptr)
{
@ -75,8 +75,8 @@ void pfmt::format_element(const char *f, const char *l, const char *fmt_spec, .
char *p1 = strstr(p, "}");
if (p1 != nullptr)
{
sl = p1 - p + 1;
strncat(fmt, p+1, p1 - p - 2);
sl = static_cast<std::size_t>(p1 - p + 1);
strncat(fmt, p+1, static_cast<std::size_t>(p1 - p - 2));
}
else
strcat(fmt, f);
@ -90,11 +90,11 @@ void pfmt::format_element(const char *f, const char *l, const char *fmt_spec, .
char *p1 = strstr(p, "}");
if (p1 != nullptr)
{
sl = p1 - p + 1;
sl = static_cast<std::size_t>(p1 - p + 1);
if (m_arg>=10)
strncat(fmt, p+4, p1 - p - 4);
strncat(fmt, p+4, static_cast<std::size_t>(p1 - p - 4));
else
strncat(fmt, p+3, p1 - p - 3);
strncat(fmt, p+3, static_cast<std::size_t>(p1 - p - 3));
}
else
strcat(fmt, f);
@ -113,14 +113,14 @@ void pfmt::format_element(const char *f, const char *l, const char *fmt_spec, .
}
else
strcat(fmt, fmt_spec);
int nl = vsprintf(buf, fmt, ap);
std::size_t nl = static_cast<std::size_t>(vsprintf(buf, fmt, ap));
if (p != nullptr)
{
// check room
unsigned new_size = (p - m_str) + nl + strlen(p) + 1 - sl;
std::size_t new_size = static_cast<std::size_t>(p - m_str) + nl + strlen(p) + 1 - sl;
if (new_size > m_allocated)
{
unsigned old_alloc = std::max(m_allocated, (unsigned) sizeof(m_str_buf));
std::size_t old_alloc = std::max(m_allocated, sizeof(m_str_buf));
if (m_allocated < old_alloc)
m_allocated = old_alloc;
while (new_size > m_allocated)

View File

@ -20,6 +20,14 @@ struct ptype_treats
{
};
template<>
struct ptype_treats<bool>
{
static unsigned int cast(bool x) { return static_cast<unsigned int>(x); }
static const bool is_signed = false;
static const char *size_specifier() { return ""; }
};
template<>
struct ptype_treats<char>
{
@ -119,6 +127,7 @@ public:
P &operator ()(char *x, const char *f = "") { format_element(f, "", "s", x); return static_cast<P &>(*this); }
P &operator ()(const void *x, const char *f = "") { format_element(f, "", "p", x); return static_cast<P &>(*this); }
P &operator ()(const pstring &x, const char *f = "") { format_element(f, "", "s", x.cstr() ); return static_cast<P &>(*this); }
P &operator ()(const pstring_t<putf8_traits> &x, const char *f = "") { format_element(f, "", "s", x.cstr() ); return static_cast<P &>(*this); }
template<typename T>
P &operator ()(const T x, const char *f = "")
@ -169,7 +178,7 @@ private:
char *m_str;
char m_str_buf[256];
unsigned m_allocated;
std::size_t m_allocated;
unsigned m_arg;
};

View File

@ -113,11 +113,13 @@ namespace plib {
}
else if (arg.startsWith("-"))
{
opt = getopt_short(arg.substr(1,1));
if (arg.len() > 2)
auto p = arg.begin() + 1;
opt = getopt_short(arg.substr(p,p + 1));
++p;
if (p != arg.end())
{
has_equal_arg = true;
opt_arg = arg.substr(2);
opt_arg = arg.substr(p);
}
}
else
@ -204,7 +206,7 @@ namespace plib {
{
line += v + "|";
}
line = line.left(line.len() - 1);
line = line.left(line.begin() + (line.len() - 1));
}
else
line += "Value";

View File

@ -29,7 +29,7 @@ void ptokenizer::skipeol()
{
c = getc();
if (c != 13)
ungetc();
ungetc(c);
return;
}
c = getc();
@ -39,24 +39,28 @@ void ptokenizer::skipeol()
pstring::code_t ptokenizer::getc()
{
if (m_px >= m_cur_line.len())
if (m_unget != 0)
{
pstring::code_t c = m_unget;
m_unget = 0;
return c;
}
if (m_px == m_cur_line.end())
{
m_lineno++;
if (m_strm.readline(m_cur_line))
{
if (m_cur_line.right(1) != "\n")
m_cur_line += "\n";
m_px = 0;
}
m_px = m_cur_line.begin();
else
return 0;
return '\n';
}
return m_cur_line.code_at(m_px++);
pstring::code_t c = *(m_px++);
return c;
}
void ptokenizer::ungetc()
void ptokenizer::ungetc(pstring::code_t c)
{
m_px--;
m_unget = c;
}
void ptokenizer::require_token(const token_id_t &token_num)
@ -68,7 +72,11 @@ void ptokenizer::require_token(const token_t tok, const token_id_t &token_num)
{
if (!tok.is(token_num))
{
error(pfmt("Expected token <{1}> got <{2}>")(m_tokens[token_num.id()])(tok.str()) );
pstring val("");
for (auto &i : m_tokens)
if (i.second.id() == token_num.id())
val = i.first;
error(pfmt("Expected token <{1}> got <{2}>")(val)(tok.str()) );
}
}
@ -163,7 +171,7 @@ ptokenizer::token_t ptokenizer::get_token_internal()
{
/* skip ws */
pstring::code_t c = getc();
while (m_whitespace.find(c)>=0)
while (m_whitespace.find(c) != m_whitespace.end())
{
c = getc();
if (eof())
@ -171,7 +179,7 @@ ptokenizer::token_t ptokenizer::get_token_internal()
return token_t(ENDOFFILE);
}
}
if (m_number_chars_start.find(c)>=0)
if (m_number_chars_start.find(c) != m_number_chars_start.end())
{
/* read number while we receive number or identifier chars
* treat it as an identifier when there are identifier chars in it
@ -180,32 +188,30 @@ ptokenizer::token_t ptokenizer::get_token_internal()
token_type ret = NUMBER;
pstring tokstr = "";
while (true) {
if (m_identifier_chars.find(c)>=0 && m_number_chars.find(c)<0)
if (m_identifier_chars.find(c) != m_identifier_chars.end() && m_number_chars.find(c) == m_number_chars.end())
ret = IDENTIFIER;
else if (m_number_chars.find(c)<0)
else if (m_number_chars.find(c) == m_number_chars.end())
break;
tokstr += c;
c = getc();
}
ungetc();
ungetc(c);
return token_t(ret, tokstr);
}
else if (m_identifier_chars.find(c)>=0)
else if (m_identifier_chars.find(c) != m_identifier_chars.end())
{
/* read identifier till non identifier char */
pstring tokstr = "";
while (m_identifier_chars.find(c)>=0) {
while (m_identifier_chars.find(c) != m_identifier_chars.end()) {
tokstr += c;
c = getc();
}
ungetc();
token_id_t id(plib::container::indexof(m_tokens, tokstr));
if (id.id() >= 0)
return token_t(id, tokstr);
ungetc(c);
auto id = m_tokens.find(tokstr);
if (id != m_tokens.end())
return token_t(id->second, tokstr);
else
{
return token_t(IDENTIFIER, tokstr);
}
}
else if (c == m_string)
{
@ -222,27 +228,24 @@ ptokenizer::token_t ptokenizer::get_token_internal()
{
/* read identifier till first identifier char or ws */
pstring tokstr = "";
while ((m_identifier_chars.find(c)) < 0 && (m_whitespace.find(c) < 0)) {
while ((m_identifier_chars.find(c)) == m_identifier_chars.end() && (m_whitespace.find(c) == m_whitespace.end())) {
tokstr += c;
/* expensive, check for single char tokens */
if (tokstr.len() == 1)
{
token_id_t id(plib::container::indexof(m_tokens, tokstr));
if (id.id() >= 0)
return token_t(id, tokstr);
auto id = m_tokens.find(tokstr);
if (id != m_tokens.end())
return token_t(id->second, tokstr);
}
c = getc();
}
ungetc();
token_id_t id(plib::container::indexof(m_tokens, tokstr));
if (id.id() >= 0)
return token_t(id, tokstr);
ungetc(c);
auto id = m_tokens.find(tokstr);
if (id != m_tokens.end())
return token_t(id->second, tokstr);
else
{
return token_t(UNKNOWN, tokstr);
}
}
}
void ptokenizer::error(const pstring &errs)
@ -406,7 +409,7 @@ pstring ppreprocessor::process_line(const pstring &line)
std::size_t start = 0;
lt = replace_macros(lt);
pstring_vector_t t(lt.substr(3).replace(" ",""), m_expr_sep);
int val = expr(t, start, 0);
int val = static_cast<int>(expr(t, start, 0));
if (val == 0)
m_ifflag |= (1 << m_level);
}

View File

@ -25,7 +25,7 @@ public:
virtual ~ptokenizer() {}
explicit ptokenizer(pistream &strm)
: m_strm(strm), m_lineno(0), m_px(0), m_string('"')
: m_strm(strm), m_lineno(0), m_cur_line(""), m_px(m_cur_line.begin()), m_unget(0), m_string('"')
{}
enum token_type
@ -42,32 +42,29 @@ public:
struct token_id_t
{
public:
token_id_t() : m_id(-2) {}
token_id_t(const int id) : m_id(id) {}
int id() const { return m_id; }
static const std::size_t npos = static_cast<std::size_t>(-1);
token_id_t() : m_id(npos) {}
token_id_t(const std::size_t id) : m_id(id) {}
std::size_t id() const { return m_id; }
private:
int m_id;
std::size_t m_id;
};
struct token_t
{
token_t(token_type type)
: m_type(type), m_id(), m_token("")
{
m_type = type;
m_id = token_id_t(-1);
m_token ="";
}
token_t(token_type type, const pstring &str)
: m_type(type), m_id(), m_token(str)
{
m_type = type;
m_id = token_id_t(-1);
m_token = str;
}
token_t(const token_id_t id, const pstring &str)
: m_type(TOKEN), m_id(id), m_token(str)
{
m_type = TOKEN;
m_id = id;
m_token = str;
}
bool is(const token_id_t &tok_id) const { return m_id.id() == tok_id.id(); }
@ -101,13 +98,14 @@ public:
token_id_t register_token(pstring token)
{
m_tokens.push_back(token);
return token_id_t(m_tokens.size() - 1);
token_id_t ret(m_tokens.size());
m_tokens.emplace(token, ret);
return ret;
}
void set_identifier_chars(pstring s) { m_identifier_chars = s; }
void set_number_chars(pstring st, pstring rem) { m_number_chars_start = st; m_number_chars = rem; }
void set_string_char(char c) { m_string = c; }
void set_string_char(pstring::code_t c) { m_string = c; }
void set_whitespace(pstring s) { m_whitespace = s; }
void set_comment(pstring start, pstring end, pstring line)
{
@ -126,7 +124,7 @@ private:
void skipeol();
pstring::code_t getc();
void ungetc();
void ungetc(pstring::code_t c);
bool eof() { return m_strm.eof(); }
@ -134,14 +132,15 @@ private:
int m_lineno;
pstring m_cur_line;
unsigned m_px;
pstring::iterator m_px;
pstring::code_t m_unget;
/* tokenizer stuff follows ... */
pstring m_identifier_chars;
pstring m_number_chars;
pstring m_number_chars_start;
std::vector<pstring> m_tokens;
std::unordered_map<pstring, token_id_t> m_tokens;
pstring m_whitespace;
pstring::code_t m_string;

View File

@ -19,7 +19,7 @@ state_manager_t::~state_manager_t()
void state_manager_t::save_state_ptr(const void *owner, const pstring &stname, const datatype_t dt, const int count, void *ptr)
void state_manager_t::save_state_ptr(const void *owner, const pstring &stname, const datatype_t dt, const std::size_t count, void *ptr)
{
auto p = plib::make_unique<entry_t>(stname, dt, owner, count, ptr);
m_save.push_back(std::move(p));

View File

@ -113,7 +113,7 @@ public:
save_state_ptr(owner, stname, datatype_f<C>::f(), N, &(state[0]));
}
template<typename C> void save_item(const void *owner, C *state, const pstring &stname, const int count)
template<typename C> void save_item(const void *owner, C *state, const pstring &stname, const std::size_t count)
{
save_state_ptr(owner, stname, datatype_f<C>::f(), count, state);
}
@ -130,7 +130,7 @@ public:
const entry_t::list_t &save_list() const { return m_save; }
void save_state_ptr(const void *owner, const pstring &stname, const datatype_t dt, const int count, void *ptr);
void save_state_ptr(const void *owner, const pstring &stname, const datatype_t dt, const std::size_t count, void *ptr);
protected:

View File

@ -47,7 +47,7 @@ bool pistream::readline(pstring &line)
void postream::write(pistream &strm)
{
char buf[1024];
unsigned r;
pos_type r;
while ((r=strm.read(buf, 1024)) > 0)
write(buf, r);
}
@ -78,9 +78,9 @@ pifilestream::pifilestream(void *file, const pstring name, const bool do_close)
void pifilestream::init()
{
if (ftell((FILE *) m_file) >= 0)
if (ftell(static_cast<FILE *>(m_file)) >= 0)
{
if (fseek((FILE *) m_file, 0, SEEK_SET) >= 0)
if (fseek(static_cast<FILE *>(m_file), 0, SEEK_SET) >= 0)
set_flag(FLAG_SEEKABLE);
}
}
@ -89,18 +89,18 @@ pifilestream::~pifilestream()
{
if (m_actually_close)
{
fclose((FILE *) m_file);
fclose(static_cast<FILE *>(m_file));
}
}
unsigned pifilestream::vread(void *buf, const unsigned n)
pifilestream::pos_type pifilestream::vread(void *buf, const pos_type n)
{
std::size_t r = fread(buf, 1, n, (FILE *) m_file);
pos_type r = fread(buf, 1, n, static_cast<FILE *>(m_file));
if (r < n)
{
if (feof((FILE *) m_file))
if (feof(static_cast<FILE *>(m_file)))
set_flag(FLAG_EOF);
if (ferror((FILE *) m_file))
if (ferror(static_cast<FILE *>(m_file)))
throw file_read_e(m_filename);
}
m_pos += r;
@ -109,27 +109,27 @@ unsigned pifilestream::vread(void *buf, const unsigned n)
void pifilestream::vseek(const pos_type n)
{
if (fseek((FILE *) m_file, SEEK_SET, n) < 0)
if (fseek(static_cast<FILE *>(m_file), static_cast<long>(n), SEEK_SET) < 0)
throw file_e("File seek failed: {}", m_filename);
else
m_pos = n;
if (feof((FILE *) m_file))
if (feof(static_cast<FILE *>(m_file)))
set_flag(FLAG_EOF);
else
clear_flag(FLAG_EOF);
if (ferror((FILE *) m_file))
if (ferror(static_cast<FILE *>(m_file)))
throw file_e("Generic file operation failed: {}", m_filename);
}
pifilestream::pos_type pifilestream::vtell()
{
long ret = ftell((FILE *) m_file);
long ret = ftell(static_cast<FILE *>(m_file));
if (ret < 0)
{
return m_pos;
}
else
return ret;
return static_cast<pos_type>(ret);
}
// -----------------------------------------------------------------------------
@ -164,23 +164,23 @@ pofilestream::pofilestream(void *file, const pstring name, const bool do_close)
void pofilestream::init()
{
if (ftell((FILE *) m_file) >= 0)
if (fseek((FILE *) m_file, 0, SEEK_SET) >= 0)
if (ftell(static_cast<FILE *>(m_file)) >= 0)
if (fseek(static_cast<FILE *>(m_file), 0, SEEK_SET) >= 0)
set_flag(FLAG_SEEKABLE);
}
pofilestream::~pofilestream()
{
if (m_actually_close)
fclose((FILE *) m_file);
fclose(static_cast<FILE *>(m_file));
}
void pofilestream::vwrite(const void *buf, const unsigned n)
void pofilestream::vwrite(const void *buf, const pos_type n)
{
std::size_t r = fwrite(buf, 1, n, (FILE *) m_file);
std::size_t r = fwrite(buf, 1, n, static_cast<FILE *>(m_file));
if (r < n)
{
if (ferror((FILE *) m_file))
if (ferror(static_cast<FILE *>(m_file)))
throw file_write_e(m_filename);
}
m_pos += r;
@ -188,25 +188,25 @@ void pofilestream::vwrite(const void *buf, const unsigned n)
void pofilestream::vseek(const pos_type n)
{
if (fseek((FILE *) m_file, SEEK_SET, n) < 0)
if (fseek(static_cast<FILE *>(m_file), static_cast<long>(n), SEEK_SET) < 0)
throw file_e("File seek failed: {}", m_filename);
else
{
m_pos = n;
if (ferror((FILE *) m_file))
if (ferror(static_cast<FILE *>(m_file)))
throw file_e("Generic file operation failed: {}", m_filename);
}
}
pstream::pos_type pofilestream::vtell()
{
long ret = ftell((FILE *) m_file);
std::ptrdiff_t ret = ftell(static_cast<FILE *>(m_file));
if (ret < 0)
{
return m_pos;
}
else
return ret;
return static_cast<pos_type>(ret);
}
// -----------------------------------------------------------------------------
@ -232,12 +232,12 @@ pstdout::pstdout()
// -----------------------------------------------------------------------------
pimemstream::pimemstream(const void *mem, const pos_type len)
: pistream(FLAG_SEEKABLE), m_pos(0), m_len(len), m_mem((char *) mem)
: pistream(FLAG_SEEKABLE), m_pos(0), m_len(len), m_mem(static_cast<const pstring::mem_t *>(mem))
{
}
pimemstream::pimemstream(const pomemstream &ostrm)
: pistream(FLAG_SEEKABLE), m_pos(0), m_len(ostrm.size()), m_mem((char *) ostrm.memory())
: pistream(FLAG_SEEKABLE), m_pos(0), m_len(ostrm.size()), m_mem(reinterpret_cast<pstring::mem_t *>(ostrm.memory()))
{
}
@ -245,9 +245,9 @@ pimemstream::~pimemstream()
{
}
unsigned pimemstream::vread(void *buf, const unsigned n)
pimemstream::pos_type pimemstream::vread(void *buf, const pos_type n)
{
unsigned ret = (m_pos + n <= m_len) ? n : m_len - m_pos;
pos_type ret = (m_pos + n <= m_len) ? n : m_len - m_pos;
if (ret > 0)
{
@ -288,7 +288,7 @@ pomemstream::~pomemstream()
pfree_array(m_mem);
}
void pomemstream::vwrite(const void *buf, const unsigned n)
void pomemstream::vwrite(const void *buf, const pos_type n)
{
if (m_pos + n >= m_capacity)
{

View File

@ -27,7 +27,7 @@ public:
using pos_type = std::size_t;
static constexpr pos_type SEEK_EOF = (pos_type) -1;
static constexpr pos_type SEEK_EOF = static_cast<pos_type>(-1);
explicit pstream(const unsigned flags) : m_flags(flags)
{
@ -92,14 +92,14 @@ public:
return (read(&b, 1) == 1);
}
unsigned read(void *buf, const unsigned n)
pos_type read(void *buf, const unsigned n)
{
return vread(buf, n);
}
protected:
/* read up to n bytes from stream */
virtual unsigned vread(void *buf, const unsigned n) = 0;
virtual pos_type vread(void *buf, const pos_type n) = 0;
private:
pstringbuffer m_linebuf;
@ -135,7 +135,7 @@ public:
write(&c, 1);
}
void write(const void *buf, const unsigned n)
void write(const void *buf, const pos_type n)
{
vwrite(buf, n);
}
@ -144,7 +144,7 @@ public:
protected:
/* write n bytes to stream */
virtual void vwrite(const void *buf, const unsigned n) = 0;
virtual void vwrite(const void *buf, const pos_type n) = 0;
private:
};
@ -162,11 +162,11 @@ public:
virtual ~pomemstream();
char *memory() const { return m_mem; }
unsigned size() const { return m_size; }
pos_type size() const { return m_size; }
protected:
/* write n bytes to stream */
virtual void vwrite(const void *buf, const unsigned n) override;
virtual void vwrite(const void *buf, const pos_type) override;
virtual void vseek(const pos_type n) override;
virtual pos_type vtell() override;
@ -190,7 +190,7 @@ public:
protected:
/* write n bytes to stream */
virtual void vwrite(const void *buf, const unsigned n) override
virtual void vwrite(const void *buf, const pos_type n) override
{
m_buf.cat(buf, n);
}
@ -216,7 +216,7 @@ public:
protected:
pofilestream(void *file, const pstring name, const bool do_close);
/* write n bytes to stream */
virtual void vwrite(const void *buf, const unsigned n) override;
virtual void vwrite(const void *buf, const pos_type n) override;
virtual void vseek(const pos_type n) override;
virtual pos_type vtell() override;
@ -267,7 +267,7 @@ protected:
pifilestream(void *file, const pstring name, const bool do_close);
/* read up to n bytes from stream */
virtual unsigned vread(void *buf, const unsigned n) override;
virtual pos_type vread(void *buf, const pos_type n) override;
virtual void vseek(const pos_type n) override;
virtual pos_type vtell() override;
@ -307,14 +307,14 @@ public:
protected:
/* read up to n bytes from stream */
virtual unsigned vread(void *buf, const unsigned n) override;
virtual pos_type vread(void *buf, const pos_type n) override;
virtual void vseek(const pos_type n) override;
virtual pos_type vtell() override;
private:
pos_type m_pos;
pos_type m_len;
char *m_mem;
const char *m_mem;
};
// -----------------------------------------------------------------------------

View File

@ -32,7 +32,7 @@ pstring_t<F>::~pstring_t()
template<typename F>
void pstring_t<F>::pcat(const mem_t *s)
{
int slen = strlen(s);
std::size_t slen = strlen(s);
pstr_t *n = salloc(m_ptr->len() + slen);
if (m_ptr->len() > 0)
std::memcpy(n->str(), m_ptr->str(), m_ptr->len());
@ -46,7 +46,7 @@ void pstring_t<F>::pcat(const mem_t *s)
template<typename F>
void pstring_t<F>::pcat(const pstring_t &s)
{
int slen = s.blen();
std::size_t slen = s.blen();
pstr_t *n = salloc(m_ptr->len() + slen);
if (m_ptr->len() > 0)
std::memcpy(n->str(), m_ptr->str(), m_ptr->len());
@ -60,7 +60,7 @@ void pstring_t<F>::pcat(const pstring_t &s)
template<typename F>
int pstring_t<F>::pcmp(const pstring_t &right) const
{
long l = std::min(blen(), right.blen());
std::size_t l = std::min(blen(), right.blen());
if (l == 0)
{
if (blen() == 0 && right.blen() == 0)
@ -72,18 +72,18 @@ int pstring_t<F>::pcmp(const pstring_t &right) const
}
int ret = memcmp(m_ptr->str(), right.cstr(), l);
if (ret == 0)
ret = this->blen() - right.blen();
if (ret < 0)
return -1;
else if (ret > 0)
return 1;
else
return 0;
{
if (this->blen() > right.blen())
ret = 1;
else if (this->blen() < right.blen())
ret = -1;
}
return ret;
}
template<typename F>
void pstring_t<F>::pcopy(const mem_t *from, int size)
void pstring_t<F>::pcopy(const mem_t *from, std::size_t size)
{
pstr_t *n = salloc(size);
if (size > 0)
@ -94,139 +94,128 @@ void pstring_t<F>::pcopy(const mem_t *from, int size)
}
template<typename F>
const pstring_t<F> pstring_t<F>::substr(unsigned start, unsigned count) const
const pstring_t<F> pstring_t<F>::substr(const iterator start, const iterator end) const
{
pstring_t ret;
unsigned alen = len();
if (start >= alen || count == 0)
return ret;
if (start + count > alen)
count = alen - start;
const mem_t *p = cstr();
// find start
for (unsigned i=0; i<start; i++)
p += F::codelen(p);
const char *e = p;
for (unsigned i=0; i<count; i++)
e += F::codelen(e);
ret.pcopy(p, e-p);
//FIXME: throw ?
ret.pcopy(start.p, static_cast<std::size_t>(end.p - start.p));
return ret;
}
template<typename F>
const pstring_t<F> pstring_t<F>::ucase() const
{
pstring_t ret = *this;
ret.pcopy(cstr(), blen());
for (std::size_t i=0; i<ret.len(); i++)
ret.m_ptr->str()[i] = toupper((unsigned) ret.m_ptr->str()[i]);
ret.m_ptr->str()[i] = static_cast<char>(toupper(static_cast<int>(ret.m_ptr->str()[i])));
return ret;
}
template<typename F>
int pstring_t<F>::find_first_not_of(const pstring_t &no) const
typename pstring_t<F>::iterator pstring_t<F>::find_first_not_of(const pstring_t &no) const
{
char *t = m_ptr->str();
unsigned nolen = no.len();
unsigned tlen = len();
for (std::size_t i=0; i < tlen; i++)
for (auto it = begin(); it != end(); ++it)
{
char *n = no.m_ptr->str();
bool f = true;
for (std::size_t j=0; j < nolen; j++)
for (auto const jt : no)
{
if (F::code(t) == F::code(n))
if (*it == jt)
{
f = false;
n += F::codelen(t);
break;
}
}
if (f)
return i;
t += F::codelen(t);
return it;
}
return -1;
return end();
}
template<typename F>
int pstring_t<F>::find_last_not_of(const pstring_t &no) const
typename pstring_t<F>::iterator pstring_t<F>::find_last_not_of(const pstring_t &no) const
{
char *t = m_ptr->str();
unsigned nolen = no.len();
unsigned tlen = len();
int last_found = -1;
for (std::size_t i=0; i < tlen; i++)
/* FIXME: reverse iterator */
iterator last_found = end();
for (auto it = begin(); it != end(); ++it)
{
char *n = no.m_ptr->str();
bool f = true;
for (std::size_t j=0; j < nolen; j++)
for (auto const jt : no)
{
if (F::code(t) == F::code(n))
if (*it == jt)
{
f = false;
n += F::codelen(t);
break;
}
}
if (f)
last_found = i;
t += F::codelen(t);
last_found = it;
}
return last_found;
}
template<typename F>
typename pstring_t<F>::iterator pstring_t<F>::find(const pstring_t &search, iterator start) const
{
for (; start != end(); ++start)
{
iterator itc(start);
auto cmp = search.begin();
while (itc != end() && cmp != search.end() && *itc == *cmp)
{
++itc;
++cmp;
}
if (cmp == search.end())
return start;
}
return end();
}
template<typename F>
pstring_t<F> pstring_t<F>::replace(const pstring_t &search, const pstring_t &replace) const
{
// FIXME: use this pstringbuffer ret = "";
pstring_t ret = "";
const int slen = search.blen();
const int tlen = blen();
pstring_t ret("");
const size_type slen = search.len();
if (slen == 0 || tlen < slen )
return *this;
int i = 0;
while (i < tlen - slen + 1)
auto last_s = begin();
auto s = find(search, last_s);
while (s != end())
{
if (memcmp(cstr()+i,search.cstr(),slen) == 0)
{
ret += replace;
i += slen;
}
else
{
/* avoid adding a code, cat a string ... */
mem_t buf[2] = { *(cstr() + i), 0 };
ret = ret.cat(buf);
i++;
}
ret += substr(last_s, s);
ret += replace;
last_s = s + slen;
s = find(search, last_s);
}
ret = ret.cat(cstr() + i);
ret += substr(last_s, end());
return ret;
}
template<typename F>
const pstring_t<F> pstring_t<F>::ltrim(const pstring_t &ws) const
{
int f = find_first_not_of(ws);
if (f>=0)
return substr(f);
else
return "";
return substr(find_first_not_of(ws), end());
}
template<typename F>
const pstring_t<F> pstring_t<F>::rtrim(const pstring_t &ws) const
{
int f = find_last_not_of(ws);
if (f>=0)
return left(f+1);
auto f = find_last_not_of(ws);
if (f==end())
return pstring_t("");
else
return "";
return substr(begin(), f + 1);
}
template<typename F>
const pstring_t<F> pstring_t<F>::rpad(const pstring_t &ws, const unsigned cnt) const
const pstring_t<F> pstring_t<F>::rpad(const pstring_t &ws, const size_type cnt) const
{
// FIXME: pstringbuffer ret(*this);
pstring_t ret(*this);
while (ret.len() < cnt)
size_type wsl = ws.len();
for (auto i = ret.len(); i < cnt; i+=wsl)
ret += ws;
return ret;
}
@ -271,193 +260,22 @@ long pstring_t<F>::as_long(bool *error) const
return ret;
}
// ----------------------------------------------------------------------------------------
// static stuff ...
// ----------------------------------------------------------------------------------------
/*
* Cached allocation of string memory
*
* This improves startup performance by 30%.
*/
#if 1
static std::stack<pstr_t *> *stk = nullptr;
static inline unsigned countleadbits(unsigned x)
{
#ifndef count_leading_zeros
unsigned msk;
unsigned ret;
if (x < 0x100)
{
msk = 0x80;
ret = 24;
}
else if (x < 0x10000)
{
msk = 0x8000;
ret = 16;
}
else if (x < 0x1000000)
{
msk = 0x800000;
ret = 8;
}
else
{
msk = 0x80000000;
ret = 0;
}
while ((msk & x) == 0 && ret < 31)
{
msk = msk >> 1;
ret++;
}
return ret;
#else
return count_leading_zeros(x);
#endif
}
template<typename F>
void pstring_t<F>::sfree(pstr_t *s)
typename pstring_t<F>::iterator pstring_t<F>::find(const mem_t *search, iterator start) const
{
s->m_ref_count--;
if (s->m_ref_count == 0 && s != &m_zero)
for (; start != end(); ++start)
{
if (stk != nullptr)
iterator itc(start);
iterator cmp(search);
while (itc != end() && *cmp != 0 && *itc == *cmp)
{
unsigned sn= ((32 - countleadbits(s->len())) + 1) / 2;
stk[sn].push(s);
++itc;
++cmp;
}
else
plib::pfree_array(((char *)s));
//_mm_free(((char *)s));
if (*cmp == 0)
return start;
}
}
template<typename F>
pstr_t *pstring_t<F>::salloc(int n)
{
if (stk == nullptr)
stk = plib::palloc_array<std::stack<pstr_t *>>(17);
pstr_t *p;
std::size_t sn= ((32 - countleadbits(n)) + 1) / 2;
std::size_t size = sizeof(pstr_t) + ((std::size_t) 1<<(sn * 2)) + 1;
if (stk[sn].empty())
p = (pstr_t *) plib::palloc_array<char>(size);
else
{
p = stk[sn].top();
stk[sn].pop();
}
// str_t *p = (str_t *) mm_malloc(size, 8);
p->init(n);
return p;
}
template<typename F>
void pstring_t<F>::resetmem()
{
if (stk != nullptr)
{
for (std::size_t i=0; i<=16; i++)
{
for (; stk[i].size() > 0; )
{
plib::pfree_array(stk[i].top());
stk[i].pop();
}
}
plib::pfree_array(stk);
stk = nullptr;
}
}
#else
template<typename F>
void pstring_t<F>::sfree(pstr_t *s)
{
s->m_ref_count--;
if (s->m_ref_count == 0 && s != &m_zero)
{
pfree_array(((char *)s));
//_mm_free(((char *)s));
}
}
template<typename F>
pstr_t *pstring_t<F>::salloc(int n)
{
int size = sizeof(pstr_t) + n + 1;
pstr_t *p = (pstr_t *) palloc_array(char, size);
// str_t *p = (str_t *) mm_malloc(size, 8);
p->init(n);
return p;
}
template<typename F>
void pstring_t<F>::resetmem()
{
// Release the 0 string
}
#endif
// ----------------------------------------------------------------------------------------
// pstring ...
// ----------------------------------------------------------------------------------------
template<typename F>
int pstring_t<F>::find(const pstring_t &search, unsigned start) const
{
const unsigned tlen = len();
const unsigned slen = search.len();
const mem_t *s = search.cstr();
const unsigned startt = std::min(start, tlen);
const mem_t *t = cstr();
for (std::size_t i=0; i<startt; i++)
t += F::codelen(t);
for (int i=0; i <= (int) tlen - (int) startt - (int) slen; i++)
{
if (F::code(t) == F::code(s))
if (std::memcmp(t,s,search.blen())==0)
return i+startt;
t += F::codelen(t);
}
return -1;
}
template<typename F>
int pstring_t<F>::find(const mem_t *search, unsigned start) const
{
const unsigned tlen = len();
unsigned slen = 0;
unsigned sblen = 0;
const mem_t *x = search;
while (*x != 0)
{
slen++;
const unsigned sl = F::codelen(x);
x += sl;
sblen += sl;
}
const char *s = search;
const unsigned startt = std::min(start, tlen);
const char *t = cstr();
for (std::size_t i=0; i<startt; i++)
t += F::codelen(t);
for (int i=0; i <= (int) tlen - (int) startt - (int) slen; i++)
{
if (F::code(t) == F::code(s))
if (std::memcmp(t,s,sblen)==0)
return i+startt;
t += F::codelen(t);
}
return -1;
return end();
}
template<typename F>
@ -466,7 +284,7 @@ bool pstring_t<F>::startsWith(const pstring_t &arg) const
if (arg.blen() > blen())
return false;
else
return (memcmp(arg.cstr(), cstr(), arg.len()) == 0);
return (memcmp(arg.cstr(), cstr(), arg.blen()) == 0);
}
template<typename F>
@ -475,14 +293,14 @@ bool pstring_t<F>::endsWith(const pstring_t &arg) const
if (arg.blen() > blen())
return false;
else
return (memcmp(cstr()+this->len()-arg.len(), arg.cstr(), arg.len()) == 0);
return (memcmp(cstr()+this->blen()-arg.blen(), arg.cstr(), arg.blen()) == 0);
}
template<typename F>
bool pstring_t<F>::startsWith(const mem_t *arg) const
{
unsigned alen = strlen(arg);
std::size_t alen = strlen(arg);
if (alen > blen())
return false;
else
@ -550,7 +368,7 @@ void pstringbuffer::pcat(const char *s)
m_len += slen;
}
void pstringbuffer::pcat(const void *m, unsigned l)
void pstringbuffer::pcat(const void *m, std::size_t l)
{
const std::size_t nl = m_len + l + 1;
resize(nl);
@ -569,5 +387,144 @@ void pstringbuffer::pcat(const pstring &s)
m_ptr[m_len] = 0;
}
// ----------------------------------------------------------------------------------------
// static stuff ...
// ----------------------------------------------------------------------------------------
/*
* Cached allocation of string memory
*
* This improves startup performance by 30%.
*/
#if 1
static std::stack<pstr_t *> *stk = nullptr;
static inline std::size_t countleadbits(std::size_t x)
{
#ifndef count_leading_zeros
std::size_t msk;
std::size_t ret;
if (x < 0x100)
{
msk = 0x80;
ret = 24;
}
else if (x < 0x10000)
{
msk = 0x8000;
ret = 16;
}
else if (x < 0x1000000)
{
msk = 0x800000;
ret = 8;
}
else
{
msk = 0x80000000;
ret = 0;
}
while ((msk & x) == 0 && ret < 31)
{
msk = msk >> 1;
ret++;
}
return ret;
#else
return count_leading_zeros(x);
#endif
}
template<typename F>
void pstring_t<F>::sfree(pstr_t *s)
{
s->m_ref_count--;
if (s->m_ref_count == 0 && s != &m_zero)
{
if (stk != nullptr)
{
size_type sn= ((32 - countleadbits(s->len())) + 1) / 2;
stk[sn].push(s);
}
else
plib::pfree_array(reinterpret_cast<char *>(s));
//_mm_free(((char *)s));
}
}
template<typename F>
pstr_t *pstring_t<F>::salloc(std::size_t n)
{
if (stk == nullptr)
stk = plib::palloc_array<std::stack<pstr_t *>>(17);
pstr_t *p;
std::size_t sn= ((32 - countleadbits(n)) + 1) / 2;
std::size_t size = sizeof(pstr_t) + (static_cast<std::size_t>(1)<<(sn * 2)) + 1;
if (stk[sn].empty())
p = reinterpret_cast<pstr_t *>(plib::palloc_array<char>(size));
else
{
p = stk[sn].top();
stk[sn].pop();
}
// str_t *p = (str_t *) mm_malloc(size, 8);
p->init(n);
return p;
}
template<typename F>
void pstring_t<F>::resetmem()
{
if (stk != nullptr)
{
for (std::size_t i=0; i<=16; i++)
{
for (; stk[i].size() > 0; )
{
plib::pfree_array(stk[i].top());
stk[i].pop();
}
}
plib::pfree_array(stk);
stk = nullptr;
}
}
#else
template<typename F>
void pstring_t<F>::sfree(pstr_t *s)
{
s->m_ref_count--;
if (s->m_ref_count == 0 && s != &m_zero)
{
plib::pfree_array(((char *)s));
//_mm_free(((char *)s));
}
}
template<typename F>
pstr_t *pstring_t<F>::salloc(int n)
{
int size = sizeof(pstr_t) + n + 1;
pstr_t *p = (pstr_t *) plib::palloc_array<char>(size);
// str_t *p = (str_t *) mm_malloc(size, 8);
p->init(n);
return p;
}
template<typename F>
void pstring_t<F>::resetmem()
{
// Release the 0 string
}
#endif
// ----------------------------------------------------------------------------------------
// template stuff ...
// ----------------------------------------------------------------------------------------
template struct pstring_t<pu8_traits>;
template struct pstring_t<putf8_traits>;

View File

@ -9,6 +9,7 @@
#include <cstdarg>
#include <cstddef>
#include <iterator>
#include "pconfig.h"
@ -22,21 +23,22 @@
struct pstr_t
{
//str_t() : m_ref_count(1), m_len(0) { m_str[0] = 0; }
pstr_t(const unsigned alen)
pstr_t(const std::size_t alen)
{
init(alen);
}
void init(const unsigned alen)
void init(const std::size_t alen)
{
m_ref_count = 1;
m_len = alen;
m_str[0] = 0;
}
char *str() { return &m_str[0]; }
unsigned len() const { return m_len; }
unsigned char *ustr() { return reinterpret_cast<unsigned char *>(&m_str[0]); }
std::size_t len() const { return m_len; }
int m_ref_count;
private:
unsigned m_len;
std::size_t m_len;
char m_str[1];
};
@ -47,8 +49,9 @@ struct pstring_t
public:
typedef F traits;
typedef typename traits::mem_t mem_t;
typedef typename traits::code_t code_t;
typedef typename F::mem_t mem_t;
typedef typename F::code_t code_t;
typedef std::size_t size_type;
// simple construction/destruction
pstring_t()
@ -66,6 +69,26 @@ public:
pstring_t &operator=(const mem_t *string) { pcopy(string); return *this; }
pstring_t &operator=(const pstring_t &string) { pcopy(string); return *this; }
struct iterator final : public std::iterator<std::forward_iterator_tag, mem_t>
{
const mem_t * p;
public:
explicit constexpr iterator(const mem_t *x) noexcept : p(x) {}
iterator(const iterator &rhs) noexcept = default;
iterator(iterator &&rhs) noexcept { p = rhs.p; }
iterator &operator=(const iterator &it) { p = it.p; return *this; }
iterator& operator++() noexcept {p += traits::codelen(p); return *this;}
iterator operator++(int) noexcept {iterator tmp(*this); operator++(); return tmp;}
bool operator==(const iterator& rhs) noexcept {return p==rhs.p;}
bool operator!=(const iterator& rhs) noexcept {return p!=rhs.p;}
const code_t operator*() noexcept {return traits::code(p);}
iterator& operator+=(size_type count) { while (count>0) { --count; ++(*this); } return *this; }
friend iterator operator+(iterator lhs, const size_type &rhs) { return (lhs += rhs); }
};
iterator begin() const { return iterator(m_ptr->str()); }
iterator end() const { return iterator(m_ptr->str() + blen()); }
// C string conversion helpers
const mem_t *cstr() const { return m_ptr->str(); }
@ -93,8 +116,8 @@ public:
bool equals(const pstring_t &string) const { return (pcmp(string) == 0); }
int cmp(const pstring_t &string) const { return pcmp(string); }
int cmp(const mem_t *string) const { return pcmp(string); }
//int cmp(const pstring_t &string) const { return pcmp(string); }
//int cmp(const mem_t *string) const { return pcmp(string); }
bool startsWith(const pstring_t &arg) const;
bool startsWith(const mem_t *arg) const;
@ -107,47 +130,45 @@ public:
const pstring_t cat(const pstring_t &s) const { return *this + s; }
const pstring_t cat(const mem_t *s) const { return *this + s; }
unsigned blen() const { return m_ptr->len(); }
size_type blen() const { return m_ptr->len(); }
// conversions
double as_double(bool *error = nullptr) const;
long as_long(bool *error = nullptr) const;
unsigned len() const
size_type len() const
{
return traits::len(m_ptr);
}
pstring_t& operator+=(const code_t c) { mem_t buf[F::MAXCODELEN+1] = { 0 }; F::encode(c, buf); pcat(buf); return *this; }
pstring_t& operator+=(const code_t c) { mem_t buf[traits::MAXCODELEN+1] = { 0 }; traits::encode(c, buf); pcat(buf); return *this; }
friend pstring_t operator+(const pstring_t &lhs, const code_t rhs) { return pstring_t(lhs) += rhs; }
int find(const pstring_t &search, unsigned start = 0) const;
int find(const mem_t *search, unsigned start = 0) const;
int find(const code_t search, unsigned start = 0) const { mem_t buf[F::MAXCODELEN+1] = { 0 }; F::encode(search, buf); return find(buf, start); }
iterator find(const pstring_t &search, iterator start) const;
iterator find(const pstring_t &search) const { return find(search, begin()); }
iterator find(const mem_t *search, iterator start) const;
iterator find(const mem_t *search) const { return find(search, begin()); }
iterator find(const code_t search, iterator start) const { mem_t buf[traits::MAXCODELEN+1] = { 0 }; traits::encode(search, buf); return find(buf, start); }
iterator find(const code_t search) const { return find(search, begin()); }
const pstring_t substr(unsigned start, unsigned count) const ;
const pstring_t substr(unsigned start) const { if (start>=len()) return pstring_t(""); else return substr(start, len()-start); }
const pstring_t substr(const iterator start, const iterator end) const ;
const pstring_t substr(const iterator start) const { return substr(start, end()); }
const pstring_t substr(size_type start) const { if (start>=len()) return pstring_t(""); else return substr(begin() + start, end()); }
const pstring_t left(unsigned count) const { return substr(0, count); }
const pstring_t right(unsigned count) const { if (len()<count) return pstring_t(*this); else return substr(len() - count, count); }
const pstring_t left(iterator leftof) const { return substr(begin(), leftof); }
const pstring_t right(iterator pos) const { return substr(pos, end()); }
int find_first_not_of(const pstring_t &no) const;
int find_last_not_of(const pstring_t &no) const;
iterator find_first_not_of(const pstring_t &no) const;
iterator find_last_not_of(const pstring_t &no) const;
const pstring_t ltrim(const pstring_t &ws = " \t\n\r") const;
const pstring_t rtrim(const pstring_t &ws = " \t\n\r") const;
const pstring_t trim(const pstring_t &ws = " \t\n\r") const { return this->ltrim(ws).rtrim(ws); }
const pstring_t rpad(const pstring_t &ws, const unsigned cnt) const;
const pstring_t rpad(const pstring_t &ws, const size_type cnt) const;
/*
* everything below MAY not work for utf8.
* Example a=s.find(EUROSIGN); b=s.substr(a,1); will deliver invalid utf8
*/
// FIXME:
code_t code_at(const unsigned pos) const { return F::code(F::nthcode(m_ptr->str(),pos)); }
code_t code_at(const size_type pos) const { return F::code(F::nthcode(m_ptr->str(),pos)); }
const pstring_t ucase() const;
@ -168,7 +189,7 @@ private:
int pcmp(const mem_t *right) const;
void pcopy(const mem_t *from, int size);
void pcopy(const mem_t *from, std::size_t size);
void pcopy(const mem_t *from);
@ -182,7 +203,7 @@ private:
void pcat(const mem_t *s);
void pcat(const pstring_t &s);
static pstr_t *salloc(int n);
static pstr_t *salloc(std::size_t n);
static void sfree(pstr_t *s);
static pstr_t m_zero;
@ -193,12 +214,12 @@ struct pu8_traits
static const unsigned MAXCODELEN = 1; /* in memory units */
typedef char mem_t;
typedef char code_t;
static unsigned len(const pstr_t *p) { return p->len(); }
static std::size_t len(const pstr_t *p) { return p->len(); }
static unsigned codelen(const mem_t *p) { return 1; }
static unsigned codelen(const code_t c) { return 1; }
static code_t code(const mem_t *p) { return *p; }
static void encode(const code_t c, mem_t *p) { *p = c; }
static const mem_t *nthcode(const mem_t *p, const unsigned n) { return &(p[n]); }
static const mem_t *nthcode(const mem_t *p, const std::size_t n) { return &(p[n]); }
};
/* No checking, this may deliver invalid codes */
@ -207,10 +228,10 @@ struct putf8_traits
static const unsigned MAXCODELEN = 4; /* in memory units, RFC 3629 */
typedef char mem_t;
typedef unsigned code_t;
static unsigned len(pstr_t *p)
static std::size_t len(pstr_t *p)
{
unsigned ret = 0;
unsigned char *c = (unsigned char *) p->str();
std::size_t ret = 0;
unsigned char *c = p->ustr();
while (*c)
{
if (!((*c & 0xC0) == 0x80))
@ -221,7 +242,7 @@ struct putf8_traits
}
static unsigned codelen(const mem_t *p)
{
unsigned char *p1 = (unsigned char *) p;
const unsigned char *p1 = reinterpret_cast<const unsigned char *>(p);
if ((*p1 & 0x80) == 0x00)
return 1;
else if ((*p1 & 0xE0) == 0xC0)
@ -248,48 +269,48 @@ struct putf8_traits
}
static code_t code(const mem_t *p)
{
unsigned char *p1 = (unsigned char *)p;
const unsigned char *p1 = reinterpret_cast<const unsigned char *>(p);
if ((*p1 & 0x80) == 0x00)
return (code_t) *p1;
return *p1;
else if ((*p1 & 0xE0) == 0xC0)
return ((p1[0] & 0x3f) << 6) | ((p1[1] & 0x3f));
return static_cast<code_t>(((p1[0] & 0x3f) << 6) | (p1[1] & 0x3f));
else if ((*p1 & 0xF0) == 0xE0)
return ((p1[0] & 0x1f) << 12) | ((p1[1] & 0x3f) << 6) | ((p1[2] & 0x3f) << 0);
return static_cast<code_t>(((p1[0] & 0x1f) << 12) | ((p1[1] & 0x3f) << 6) | ((p1[2] & 0x3f) << 0));
else if ((*p1 & 0xF8) == 0xF0)
return ((p1[0] & 0x0f) << 18) | ((p1[1] & 0x3f) << 12) | ((p1[2] & 0x3f) << 6) | ((p1[3] & 0x3f) << 0);
return static_cast<code_t>(((p1[0] & 0x0f) << 18) | ((p1[1] & 0x3f) << 12) | ((p1[2] & 0x3f) << 6) | ((p1[3] & 0x3f) << 0));
else
return *p1; // not correct
}
static void encode(const code_t c, mem_t *p)
{
unsigned char *m = (unsigned char*)p;
unsigned char *m = reinterpret_cast<unsigned char *>(p);
if (c < 0x0080)
{
m[0] = c;
m[0] = static_cast<unsigned char>(c);
}
else if (c < 0x800)
{
m[0] = 0xC0 | (c >> 6);
m[1] = 0x80 | (c & 0x3f);
m[0] = static_cast<unsigned char>(0xC0 | (c >> 6));
m[1] = static_cast<unsigned char>(0x80 | (c & 0x3f));
}
else if (c < 0x10000)
{
m[0] = 0xE0 | (c >> 12);
m[1] = 0x80 | ((c>>6) & 0x3f);
m[2] = 0x80 | (c & 0x3f);
m[0] = static_cast<unsigned char>(0xE0 | (c >> 12));
m[1] = static_cast<unsigned char>(0x80 | ((c>>6) & 0x3f));
m[2] = static_cast<unsigned char>(0x80 | (c & 0x3f));
}
else /* U+10000 U+1FFFFF */
{
m[0] = 0xF0 | (c >> 18);
m[1] = 0x80 | ((c>>12) & 0x3f);
m[2] = 0x80 | ((c>>6) & 0x3f);
m[3] = 0x80 | (c & 0x3f);
m[0] = static_cast<unsigned char>(0xF0 | (c >> 18));
m[1] = static_cast<unsigned char>(0x80 | ((c>>12) & 0x3f));
m[2] = static_cast<unsigned char>(0x80 | ((c>>6) & 0x3f));
m[3] = static_cast<unsigned char>(0x80 | (c & 0x3f));
}
}
static const mem_t *nthcode(const mem_t *p, const unsigned n)
static const mem_t *nthcode(const mem_t *p, const std::size_t n)
{
const mem_t *p1 = p;
int i = n;
std::size_t i = n;
while (i-- > 0)
p1 += codelen(p1);
return p1;
@ -358,7 +379,7 @@ public:
void cat(const pstring &s) { pcat(s); }
void cat(const char *s) { pcat(s); }
void cat(const void *m, unsigned l) { pcat(m, l); }
void cat(const void *m, std::size_t l) { pcat(m, l); }
void clear() { m_len = 0; *m_ptr = 0; }
@ -377,7 +398,7 @@ private:
void pcopy(const pstring &from);
void pcat(const char *s);
void pcat(const pstring &s);
void pcat(const void *m, unsigned l);
void pcat(const void *m, std::size_t l);
char *m_ptr;
std::size_t m_size;
@ -397,7 +418,7 @@ namespace std
const pstring::mem_t *string = s.cstr();
result_type result = 5381;
for (pstring::mem_t c = *string; c != 0; c = *string++)
result = ((result << 5) + result ) ^ (result >> (32 - 5)) ^ c;
result = ((result << 5) + result ) ^ (result >> (32 - 5)) ^ static_cast<result_type>(c);
return result;
}
};

View File

@ -58,15 +58,14 @@ namespace plib
bool set_from_string (const pstring &s) { \
static const char *strings = # __VA_ARGS__; \
int f = from_string_int(strings, s.cstr()); \
if (f>=0) { m_v = (e) f; return true; } else { return false; } \
if (f>=0) { m_v = static_cast<e>(f); return true; } else { return false; } \
} \
operator e() const {return m_v;} \
int as_int() const {return (int) m_v;} \
bool operator==(const ename &rhs) const {return m_v == rhs.m_v;} \
bool operator==(const e &rhs) const {return m_v == (int) rhs;} \
bool operator==(const e &rhs) const {return m_v == rhs;} \
const pstring name() const { \
static const char *strings = # __VA_ARGS__; \
return nthstr((int) m_v, strings); \
return nthstr(static_cast<int>(m_v), strings); \
} \
private: e m_v; };

View File

@ -43,21 +43,20 @@ namespace plib
pstring_vector_t::pstring_vector_t(const pstring &str, const pstring &onstr, bool ignore_empty)
: std::vector<pstring>()
{
int p = 0;
int pn;
pstring::iterator p = str.begin();
pstring::iterator pn = str.find(onstr, p);
pn = str.find(onstr, p);
while (pn>=0)
while (pn != str.end())
{
pstring t = str.substr(p, pn - p);
pstring t = str.substr(p, pn);
if (!ignore_empty || t.len() != 0)
this->push_back(t);
p = pn + onstr.len();
pn = str.find(onstr, p);
}
if (p < (int) str.len())
if (p != str.end())
{
pstring t = str.substr(p);
pstring t = str.substr(p, str.end());
if (!ignore_empty || t.len() != 0)
this->push_back(t);
}
@ -71,7 +70,7 @@ namespace plib
unsigned i = 0;
while (i<str.blen())
{
int p = -1;
std::size_t p = static_cast<std::size_t>(-1);
for (std::size_t j=0; j < onstrl.size(); j++)
{
if (std::memcmp(onstrl[j].cstr(), &(str.cstr()[i]), onstrl[j].blen())==0)
@ -80,7 +79,7 @@ namespace plib
break;
}
}
if (p>=0)
if (p != static_cast<std::size_t>(-1))
{
if (col != "")
this->push_back(col);
@ -105,13 +104,13 @@ namespace plib
{
int cnt = 0;
const char *cur = str;
int lx = strlen(x);
std::size_t lx = strlen(x);
while (*str)
{
if (*str == ',')
{
int l = str-cur;
if (l == lx)
std::ptrdiff_t l = str-cur;
if (static_cast<std::size_t>(l) == lx)
if (strncmp(cur, x, lx) == 0)
return cnt;
}
@ -122,8 +121,8 @@ namespace plib
}
str++;
}
int l = str-cur;
if (l == lx)
std::ptrdiff_t l = str-cur;
if (static_cast<std::size_t>(l) == lx)
if (strncmp(cur, x, lx) == 0)
return cnt;
return -1;

View File

@ -29,19 +29,20 @@ namespace plib
return std::find(con.begin(), con.end(), elem) != con.end();
}
static constexpr const std::size_t npos = static_cast<std::size_t>(-1);
template <class C>
int indexof(C &con, const typename C::value_type &elem)
std::size_t indexof(C &con, const typename C::value_type &elem)
{
auto it = std::find(con.begin(), con.end(), elem);
if (it != con.end())
return it - con.begin();
return -1;
return static_cast<std::size_t>(it - con.begin());
return npos;
}
template <class C>
void insert_at(C &con, const std::size_t index, const typename C::value_type &elem)
{
con.insert(con.begin() + index, elem);
con.insert(con.begin() + static_cast<std::ptrdiff_t>(index), elem);
}
}

View File

@ -36,7 +36,7 @@ public:
opt_help(*this, "h", "help", "display help and exit"),
opt_grp2(*this, "Options for run and static commands", "These options apply to run and static commands."),
opt_name(*this, "n", "name", "", "the netlist in file specified by ""-f"" option to run; default is first one"),
opt_grp3(*this, "Options for run command", "These options are only used by the run command."),
opt_grp3(*this, "Options for run command", "These options are only used by the run command."),
opt_ttr (*this, "t", "time_to_run", 1.0, "time to run the emulation (seconds)"),
opt_logs(*this, "l", "log" , "define terminal to log. This option may be specified repeatedly."),
opt_inp(*this, "i", "input", "", "input file to process (default is none)"),
@ -196,10 +196,10 @@ struct input_t
static_cast<netlist::param_double_t*>(m_param)->setTo(m_value);
break;
case netlist::param_t::INTEGER:
static_cast<netlist::param_int_t*>(m_param)->setTo((int)m_value);
static_cast<netlist::param_int_t*>(m_param)->setTo(static_cast<int>(m_value));
break;
case netlist::param_t::LOGIC:
static_cast<netlist::param_logic_t*>(m_param)->setTo((int) m_value);
static_cast<netlist::param_logic_t*>(m_param)->setTo(static_cast<bool>(m_value));
break;
}
}
@ -335,7 +335,7 @@ static void listdevices(tool_options_t &opts)
if (t.second->name().startsWith(d->name()))
{
pstring tn(t.second->name().substr(d->name().len()+1));
if (tn.find(".")<0)
if (tn.find(".") == tn.end())
terms.push_back(tn);
}
}
@ -345,7 +345,7 @@ static void listdevices(tool_options_t &opts)
if (t.first.startsWith(d->name()))
{
pstring tn(t.first.substr(d->name().len()+1));
if (tn.find(".")<0)
if (tn.find(".") == tn.end())
{
terms.push_back(tn);
pstring resolved = nt.setup().resolve_alias(t.first);

View File

@ -63,7 +63,7 @@ public:
void write_sample(int sample)
{
m_data.len += m_fmt.block_align;
short ps = sample; /* 16 bit sample, FIXME: Endianess? */
short ps = static_cast<short>(sample); /* 16 bit sample, FIXME: Endianess? */
m_f.write(&ps, sizeof(ps));
}
@ -77,14 +77,14 @@ private:
struct riff_format_t
{
char signature[4];
unsigned fmt_length;
short format_tag;
short channels;
unsigned sample_rate;
unsigned bytes_per_second;
short block_align;
short bits_sample;
char signature[4];
unsigned fmt_length;
short format_tag;
unsigned short channels;
unsigned sample_rate;
unsigned bytes_per_second;
unsigned short block_align;
unsigned short bits_sample;
};
struct riff_data_t
@ -129,7 +129,7 @@ static void convert(nlwav_options_t &opts)
plib::pifilestream fin(opts.opt_inp());
double dt = 1.0 / (double) wo.sample_rate();
double dt = 1.0 / static_cast<double>(wo.sample_rate());
double ct = dt;
//double mean = 2.4;
double amp = opts.opt_amp();
@ -160,12 +160,12 @@ static void convert(nlwav_options_t &opts)
minsam = std::min(minsam, outsam);
n++;
//mean = means / (double) n;
mean += 5.0 / (double) wo.sample_rate() * (outsam - mean);
mean += 5.0 / static_cast<double>(wo.sample_rate()) * (outsam - mean);
}
outsam = (outsam - mean) * amp;
outsam = std::max(-32000.0, outsam);
outsam = std::min(32000.0, outsam);
wo.write_sample((int) outsam);
wo.write_sample(static_cast<int>(outsam));
outsam = 0.0;
lt = ct;
ct += dt;
@ -195,7 +195,7 @@ static void convert(nlwav_options_t &opts)
#endif
}
pout("Mean (low freq filter): {}\n", mean);
pout("Mean (static): {}\n", means / (double) n);
pout("Mean (static): {}\n", means / static_cast<double>(n));
pout("Amp + {}\n", 32000.0 / (maxsam- mean));
pout("Amp - {}\n", -32000.0 / (minsam- mean));
}

View File

@ -29,8 +29,8 @@ namespace netlist
nl_double m_max_timestep;
nl_double m_sor;
bool m_dynamic;
int m_gs_loops;
int m_nr_loops;
unsigned m_gs_loops;
unsigned m_nr_loops;
netlist_time m_nt_sync_delay;
bool m_log_stats;
};
@ -60,7 +60,7 @@ public:
void add(terminal_t *term, int net_other, bool sorted);
inline unsigned count() { return m_term.size(); }
inline std::size_t count() { return m_term.size(); }
inline terminal_t **terms() { return m_term.data(); }
inline int *net_other() { return m_net_other.data(); }
@ -71,7 +71,7 @@ public:
void set_pointers();
unsigned m_railstart;
std::size_t m_railstart;
std::vector<unsigned> m_nz; /* all non zero for multiplication */
std::vector<unsigned> m_nzrd; /* non zero right of the diagonal for elimination, may include RHS element */
@ -157,7 +157,7 @@ public:
NETLIB_RESETI();
public:
int get_net_idx(net_t *net);
int get_net_idx(detail::net_t *net);
plib::plog_base<NL_DEBUG> &log() { return netlist().log(); }
@ -174,10 +174,10 @@ protected:
void update_dynamic();
virtual void vsetup(analog_net_t::list_t &nets) = 0;
virtual int vsolve_non_dynamic(const bool newton_raphson) = 0;
virtual unsigned vsolve_non_dynamic(const bool newton_raphson) = 0;
netlist_time compute_next_timestep(const double cur_ts);
/* virtual */ void add_term(int net_idx, terminal_t *term);
/* virtual */ void add_term(std::size_t net_idx, terminal_t *term);
template <typename T>
void store(const T * RESTRICT V);
@ -230,17 +230,17 @@ T matrix_solver_t::delta(const T * RESTRICT V)
* and thus belong into a different calculation. This applies to all solvers.
*/
const unsigned iN = this->m_terms.size();
std::size_t iN = this->m_terms.size();
T cerr = 0;
for (unsigned i = 0; i < iN; i++)
cerr = std::max(cerr, std::abs(V[i] - (T) this->m_nets[i]->m_cur_Analog));
cerr = std::max(cerr, std::abs(V[i] - static_cast<T>(this->m_nets[i]->m_cur_Analog)));
return cerr;
}
template <typename T>
void matrix_solver_t::store(const T * RESTRICT V)
{
for (unsigned i = 0, iN=m_terms.size(); i < iN; i++)
for (std::size_t i = 0, iN=m_terms.size(); i < iN; i++)
this->m_nets[i]->m_cur_Analog = V[i];
}
@ -257,8 +257,8 @@ void matrix_solver_t::build_LE_A()
for (unsigned i=0; i < iN; i++)
child.A(k,i) = 0.0;
const unsigned terms_count = m_terms[k]->count();
const unsigned railstart = m_terms[k]->m_railstart;
const std::size_t terms_count = m_terms[k]->count();
const std::size_t railstart = m_terms[k]->m_railstart;
const nl_double * RESTRICT gt = m_terms[k]->gt();
{
@ -272,7 +272,7 @@ void matrix_solver_t::build_LE_A()
const nl_double * RESTRICT go = m_terms[k]->go();
const int * RESTRICT net_other = m_terms[k]->net_other();
for (unsigned i = 0; i < railstart; i++)
for (std::size_t i = 0; i < railstart; i++)
child.A(k,net_other[i]) -= go[i];
}
}
@ -289,15 +289,15 @@ void matrix_solver_t::build_LE_RHS()
nl_double rhsk_a = 0.0;
nl_double rhsk_b = 0.0;
const unsigned terms_count = m_terms[k]->count();
const std::size_t terms_count = m_terms[k]->count();
const nl_double * RESTRICT go = m_terms[k]->go();
const nl_double * RESTRICT Idr = m_terms[k]->Idr();
const nl_double * const * RESTRICT other_cur_analog = m_terms[k]->other_curanalog();
for (unsigned i = 0; i < terms_count; i++)
for (std::size_t i = 0; i < terms_count; i++)
rhsk_a = rhsk_a + Idr[i];
for (unsigned i = m_terms[k]->m_railstart; i < terms_count; i++)
for (std::size_t i = m_terms[k]->m_railstart; i < terms_count; i++)
//rhsk = rhsk + go[i] * terms[i]->m_otherterm->net().as_analog().Q_Analog();
rhsk_b = rhsk_b + go[i] * *other_cur_analog[i];

View File

@ -123,8 +123,8 @@ class matrix_solver_direct_t: public matrix_solver_t
friend class matrix_solver_t;
public:
matrix_solver_direct_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params, const int size);
matrix_solver_direct_t(netlist_t &anetlist, const pstring &name, const eSortType sort, const solver_parameters_t *params, const int size);
matrix_solver_direct_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params, const unsigned size);
matrix_solver_direct_t(netlist_t &anetlist, const pstring &name, const eSortType sort, const solver_parameters_t *params, const unsigned size);
virtual ~matrix_solver_direct_t();
@ -132,8 +132,8 @@ public:
virtual void reset() override { matrix_solver_t::reset(); }
protected:
virtual int vsolve_non_dynamic(const bool newton_raphson) override;
int solve_non_dynamic(const bool newton_raphson);
virtual unsigned vsolve_non_dynamic(const bool newton_raphson) override;
unsigned solve_non_dynamic(const bool newton_raphson);
inline unsigned N() const { if (m_N == 0) return m_dim; else return m_N; }
@ -348,17 +348,17 @@ void matrix_solver_direct_t<m_N, storage_N>::LE_back_subst(
/* back substitution */
if (m_params.m_pivot)
{
for (int j = kN - 1; j >= 0; j--)
for (unsigned j = kN; j-- > 0; )
{
T tmp = 0;
for (unsigned k = j+1; k < kN; k++)
for (std::size_t k = j+1; k < kN; k++)
tmp += A(j,k) * x[k];
x[j] = (RHS(j) - tmp) / A(j,j);
}
}
else
{
for (int j = kN - 1; j >= 0; j--)
for (unsigned j = kN; j-- > 0; )
{
T tmp = 0;
@ -377,7 +377,7 @@ void matrix_solver_direct_t<m_N, storage_N>::LE_back_subst(
template <unsigned m_N, unsigned storage_N>
int matrix_solver_direct_t<m_N, storage_N>::solve_non_dynamic(const bool newton_raphson)
unsigned matrix_solver_direct_t<m_N, storage_N>::solve_non_dynamic(const bool newton_raphson)
{
nl_double new_V[storage_N]; // = { 0.0 };
@ -400,7 +400,7 @@ int matrix_solver_direct_t<m_N, storage_N>::solve_non_dynamic(const bool newton_
}
template <unsigned m_N, unsigned storage_N>
inline int matrix_solver_direct_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_raphson)
inline unsigned matrix_solver_direct_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_raphson)
{
build_LE_A<matrix_solver_direct_t>();
build_LE_RHS<matrix_solver_direct_t>();
@ -414,7 +414,7 @@ inline int matrix_solver_direct_t<m_N, storage_N>::vsolve_non_dynamic(const bool
template <unsigned m_N, unsigned storage_N>
matrix_solver_direct_t<m_N, storage_N>::matrix_solver_direct_t(netlist_t &anetlist, const pstring &name,
const solver_parameters_t *params, const int size)
const solver_parameters_t *params, const unsigned size)
: matrix_solver_t(anetlist, name, ASCENDING, params)
, m_dim(size)
{
@ -432,7 +432,7 @@ matrix_solver_direct_t<m_N, storage_N>::matrix_solver_direct_t(netlist_t &anetli
template <unsigned m_N, unsigned storage_N>
matrix_solver_direct_t<m_N, storage_N>::matrix_solver_direct_t(netlist_t &anetlist, const pstring &name,
const eSortType sort, const solver_parameters_t *params, const int size)
const eSortType sort, const solver_parameters_t *params, const unsigned size)
: matrix_solver_t(anetlist, name, sort, params)
, m_dim(size)
{

View File

@ -22,7 +22,7 @@ public:
matrix_solver_direct1_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params)
: matrix_solver_direct_t<1, 1>(anetlist, name, params, 1)
{}
virtual int vsolve_non_dynamic(const bool newton_raphson) override;
virtual unsigned vsolve_non_dynamic(const bool newton_raphson) override;
};
@ -30,7 +30,7 @@ public:
// matrix_solver - Direct1
// ----------------------------------------------------------------------------------------
inline int matrix_solver_direct1_t::vsolve_non_dynamic(ATTR_UNUSED const bool newton_raphson)
inline unsigned matrix_solver_direct1_t::vsolve_non_dynamic(ATTR_UNUSED const bool newton_raphson)
{
build_LE_A<matrix_solver_direct1_t>();
build_LE_RHS<matrix_solver_direct1_t>();

View File

@ -22,7 +22,7 @@ public:
matrix_solver_direct2_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params)
: matrix_solver_direct_t<2, 2>(anetlist, name, params, 2)
{}
virtual int vsolve_non_dynamic(const bool newton_raphson) override;
virtual unsigned vsolve_non_dynamic(const bool newton_raphson) override;
};
@ -30,7 +30,7 @@ public:
// matrix_solver - Direct2
// ----------------------------------------------------------------------------------------
inline int matrix_solver_direct2_t::vsolve_non_dynamic(ATTR_UNUSED const bool newton_raphson)
inline unsigned matrix_solver_direct2_t::vsolve_non_dynamic(ATTR_UNUSED const bool newton_raphson)
{
build_LE_A<matrix_solver_direct2_t>();
build_LE_RHS<matrix_solver_direct2_t>();

View File

@ -28,8 +28,8 @@ class matrix_solver_direct_t: public matrix_solver_t
{
public:
matrix_solver_direct_t(const solver_parameters_t *params, const int size);
matrix_solver_direct_t(const eSolverType type, const solver_parameters_t *params, const int size);
matrix_solver_direct_t(const solver_parameters_t *params, const unsigned size);
matrix_solver_direct_t(const eSolverType type, const solver_parameters_t *params, const unsigned size);
virtual ~matrix_solver_direct_t();
@ -568,7 +568,7 @@ void matrix_solver_direct_t<m_N, storage_N>::store(
template <unsigned m_N, unsigned storage_N>
int matrix_solver_direct_t<m_N, storage_N>::solve_non_dynamic(const bool newton_raphson)
unsigned matrix_solver_direct_t<m_N, storage_N>::solve_non_dynamic(const bool newton_raphson)
{
nl_double new_V[storage_N]; // = { 0.0 };
@ -602,7 +602,7 @@ inline int matrix_solver_direct_t<m_N, storage_N>::vsolve_non_dynamic(const bool
}
template <unsigned m_N, unsigned storage_N>
matrix_solver_direct_t<m_N, storage_N>::matrix_solver_direct_t(const solver_parameters_t *params, const int size)
matrix_solver_direct_t<m_N, storage_N>::matrix_solver_direct_t(const solver_parameters_t *params, const unsigned size)
: matrix_solver_t(GAUSSIAN_ELIMINATION, params)
, m_dim(size)
, m_lp_fact(0)
@ -616,7 +616,7 @@ matrix_solver_direct_t<m_N, storage_N>::matrix_solver_direct_t(const solver_para
}
template <unsigned m_N, unsigned storage_N>
matrix_solver_direct_t<m_N, storage_N>::matrix_solver_direct_t(const eSolverType type, const solver_parameters_t *params, const int size)
matrix_solver_direct_t<m_N, storage_N>::matrix_solver_direct_t(const eSolverType type, const solver_parameters_t *params, const unsigned size)
: matrix_solver_t(type, params)
, m_dim(size)
, m_lp_fact(0)

View File

@ -33,7 +33,7 @@ class matrix_solver_GCR_t: public matrix_solver_t
public:
matrix_solver_GCR_t(netlist_t &anetlist, const pstring &name,
const solver_parameters_t *params, int size)
const solver_parameters_t *params, const unsigned size)
: matrix_solver_t(anetlist, name, matrix_solver_t::ASCENDING, params)
, m_dim(size)
, m_proc(nullptr)
@ -47,7 +47,7 @@ public:
inline unsigned N() const { if (m_N == 0) return m_dim; else return m_N; }
virtual void vsetup(analog_net_t::list_t &nets) override;
virtual int vsolve_non_dynamic(const bool newton_raphson) override;
virtual unsigned vsolve_non_dynamic(const bool newton_raphson) override;
virtual void create_solver_code(plib::postream &strm) override;
@ -67,7 +67,7 @@ private:
}
unsigned m_dim;
std::vector<int> m_term_cr[storage_N];
std::vector<unsigned> m_term_cr[storage_N];
mat_cr_t<storage_N> mat;
nl_double m_A[storage_N * storage_N];
@ -152,7 +152,7 @@ void matrix_solver_GCR_t<m_N, storage_N>::vsetup(analog_net_t::list_t &nets)
{
int other = this->m_terms[k]->net_other()[j];
for (unsigned i = mat.ia[k]; i < nz; i++)
if (other == (int) mat.ja[i])
if (other == static_cast<int>(mat.ja[i]))
{
m_term_cr[k].push_back(i);
break;
@ -164,7 +164,8 @@ void matrix_solver_GCR_t<m_N, storage_N>::vsetup(analog_net_t::list_t &nets)
mat.ia[iN] = nz;
mat.nz_num = nz;
this->log().verbose("Ops: {1} Occupancy ratio: {2}\n", ops, (double) nz / double (iN * iN));
this->log().verbose("Ops: {1} Occupancy ratio: {2}\n", ops,
static_cast<double>(nz) / static_cast<double>(iN * iN));
// FIXME: Move me
@ -238,7 +239,7 @@ void matrix_solver_GCR_t<m_N, storage_N>::create_solver_code(plib::postream &str
template <unsigned m_N, unsigned storage_N>
int matrix_solver_GCR_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_raphson)
unsigned matrix_solver_GCR_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_raphson)
{
const unsigned iN = this->N();
@ -254,8 +255,8 @@ int matrix_solver_GCR_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_ra
nl_double gtot_t = 0.0;
nl_double RHS_t = 0.0;
const unsigned term_count = t->count();
const unsigned railstart = t->m_railstart;
const std::size_t term_count = t->count();
const std::size_t railstart = t->m_railstart;
const nl_double * const RESTRICT gt = t->gt();
const nl_double * const RESTRICT go = t->go();
const nl_double * const RESTRICT Idr = t->Idr();
@ -284,7 +285,7 @@ int matrix_solver_GCR_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_ra
RHS_t += Idr[i];
}
#endif
for (unsigned i = railstart; i < term_count; i++)
for (std::size_t i = railstart; i < term_count; i++)
RHS_t += go[i] * *other_cur_analog[i];
RHS[k] = RHS_t;
@ -350,7 +351,7 @@ int matrix_solver_GCR_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_ra
/* row n-1 */
new_V[iN - 1] = RHS[iN - 1] / m_A[mat.diag[iN - 1]];
for (int j = iN - 2; j >= 0; j--)
for (unsigned j = iN - 1; j-- > 0;)
{
//__builtin_prefetch(&new_V[j-1], 1);
//if (j>0)__builtin_prefetch(&m_A[mat.diag[j-1]], 0);

View File

@ -28,7 +28,7 @@ class matrix_solver_GMRES_t: public matrix_solver_direct_t<m_N, storage_N>
{
public:
matrix_solver_GMRES_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params, int size)
matrix_solver_GMRES_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params, const unsigned size)
: matrix_solver_direct_t<m_N, storage_N>(anetlist, name, matrix_solver_t::ASCENDING, params, size)
, m_use_iLU_preconditioning(true)
, m_use_more_precise_stop_condition(false)
@ -41,13 +41,13 @@ public:
}
virtual void vsetup(analog_net_t::list_t &nets) override;
virtual int vsolve_non_dynamic(const bool newton_raphson) override;
virtual unsigned vsolve_non_dynamic(const bool newton_raphson) override;
private:
int solve_ilu_gmres(nl_double * RESTRICT x, const nl_double * RESTRICT rhs, const unsigned restart_max, const unsigned mr, nl_double accuracy);
unsigned solve_ilu_gmres(nl_double * RESTRICT x, const nl_double * RESTRICT rhs, const unsigned restart_max, const unsigned mr, nl_double accuracy);
std::vector<int> m_term_cr[storage_N];
std::vector<unsigned> m_term_cr[storage_N];
bool m_use_iLU_preconditioning;
bool m_use_more_precise_stop_condition;
@ -97,7 +97,7 @@ void matrix_solver_GMRES_t<m_N, storage_N>::vsetup(analog_net_t::list_t &nets)
for (unsigned j=0; j< this->m_terms[k]->m_railstart;j++)
{
for (unsigned i = mat.ia[k]; i<nz; i++)
if (this->m_terms[k]->net_other()[j] == (int) mat.ja[i])
if (this->m_terms[k]->net_other()[j] == static_cast<int>(mat.ja[i]))
{
m_term_cr[k].push_back(i);
break;
@ -111,7 +111,7 @@ void matrix_solver_GMRES_t<m_N, storage_N>::vsetup(analog_net_t::list_t &nets)
}
template <unsigned m_N, unsigned storage_N>
int matrix_solver_GMRES_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_raphson)
unsigned matrix_solver_GMRES_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_raphson)
{
const unsigned iN = this->N();
@ -135,8 +135,8 @@ int matrix_solver_GMRES_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_
nl_double gtot_t = 0.0;
nl_double RHS_t = 0.0;
const unsigned term_count = this->m_terms[k]->count();
const unsigned railstart = this->m_terms[k]->m_railstart;
const std::size_t term_count = this->m_terms[k]->count();
const std::size_t railstart = this->m_terms[k]->m_railstart;
const nl_double * const RESTRICT gt = this->m_terms[k]->gt();
const nl_double * const RESTRICT go = this->m_terms[k]->go();
const nl_double * const RESTRICT Idr = this->m_terms[k]->Idr();
@ -144,13 +144,13 @@ int matrix_solver_GMRES_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_
new_V[k] = this->m_nets[k]->m_cur_Analog;
for (unsigned i = 0; i < term_count; i++)
for (std::size_t i = 0; i < term_count; i++)
{
gtot_t = gtot_t + gt[i];
RHS_t = RHS_t + Idr[i];
}
for (unsigned i = railstart; i < term_count; i++)
for (std::size_t i = railstart; i < term_count; i++)
RHS_t = RHS_t + go[i] * *other_cur_analog[i];
RHS[k] = RHS_t;
@ -158,7 +158,7 @@ int matrix_solver_GMRES_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_
// add diagonal element
m_A[mat.diag[k]] = gtot_t;
for (unsigned i = 0; i < railstart; i++)
for (std::size_t i = 0; i < railstart; i++)
{
const unsigned pi = m_term_cr[k][i];
m_A[pi] -= go[i];
@ -168,12 +168,12 @@ int matrix_solver_GMRES_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_
const nl_double accuracy = this->m_params.m_accuracy;
int mr = iN;
unsigned mr = iN;
if (iN > 3 )
mr = (int) sqrt(iN) * 2;
int iter = std::max(1, this->m_params.m_gs_loops);
int gsl = solve_ilu_gmres(new_V, RHS, iter, mr, accuracy);
int failed = mr * iter;
mr = static_cast<unsigned>(std::sqrt(iN) * 2.0);
unsigned iter = std::max(1u, this->m_params.m_gs_loops);
unsigned gsl = solve_ilu_gmres(new_V, RHS, iter, mr, accuracy);
unsigned failed = mr * iter;
this->m_iterative_total += gsl;
this->m_stat_calculations++;
@ -210,7 +210,7 @@ inline void givens_mult( const T & c, const T & s, T & g0, T & g1 )
}
template <unsigned m_N, unsigned storage_N>
int matrix_solver_GMRES_t<m_N, storage_N>::solve_ilu_gmres (nl_double * RESTRICT x, const nl_double * RESTRICT rhs, const unsigned restart_max, const unsigned mr, nl_double accuracy)
unsigned matrix_solver_GMRES_t<m_N, storage_N>::solve_ilu_gmres (nl_double * RESTRICT x, const nl_double * RESTRICT rhs, const unsigned restart_max, const unsigned mr, nl_double accuracy)
{
/*-------------------------------------------------------------------------
* The code below was inspired by code published by John Burkardt under
@ -266,7 +266,7 @@ int matrix_solver_GMRES_t<m_N, storage_N>::solve_ilu_gmres (nl_double * RESTRICT
rho_delta = accuracy * rho_to_accuracy;
}
else
rho_delta = accuracy * std::sqrt((double) n) * m_accuracy_mult;
rho_delta = accuracy * std::sqrt(n) * m_accuracy_mult;
for (unsigned itr = 0; itr < restart_max; itr++)
{
@ -344,7 +344,7 @@ int matrix_solver_GMRES_t<m_N, storage_N>::solve_ilu_gmres (nl_double * RESTRICT
/* Solve the system H * y = g */
/* x += m_v[j] * m_y[j] */
for (int i = last_k; i >= 0; i--)
for (unsigned i = last_k + 1; i-- > 0;)
{
double tmp = m_g[i];
for (unsigned j = i + 1; j <= last_k; j++)

View File

@ -55,7 +55,7 @@ class matrix_solver_sm_t: public matrix_solver_t
public:
matrix_solver_sm_t(netlist_t &anetlist, const pstring &name,
const solver_parameters_t *params, const int size);
const solver_parameters_t *params, const unsigned size);
virtual ~matrix_solver_sm_t();
@ -63,8 +63,8 @@ public:
virtual void reset() override { matrix_solver_t::reset(); }
protected:
virtual int vsolve_non_dynamic(const bool newton_raphson) override;
int solve_non_dynamic(const bool newton_raphson);
virtual unsigned vsolve_non_dynamic(const bool newton_raphson) override;
unsigned solve_non_dynamic(const bool newton_raphson);
inline unsigned N() const { if (m_N == 0) return m_dim; else return m_N; }
@ -155,19 +155,19 @@ void matrix_solver_sm_t<m_N, storage_N>::LE_invert()
/* FIXME: Singular matrix? */
const nl_double f = 1.0 / W(i,i);
const auto * RESTRICT const p = m_terms[i]->m_nzrd.data();
const unsigned e = m_terms[i]->m_nzrd.size();
const std::size_t e = m_terms[i]->m_nzrd.size();
/* Eliminate column i from row j */
const auto * RESTRICT const pb = m_terms[i]->m_nzbd.data();
const unsigned eb = m_terms[i]->m_nzbd.size();
for (unsigned jb = 0; jb < eb; jb++)
const std::size_t eb = m_terms[i]->m_nzbd.size();
for (std::size_t jb = 0; jb < eb; jb++)
{
const unsigned j = pb[jb];
const nl_double f1 = - W(j,i) * f;
if (f1 != 0.0)
{
for (unsigned k = 0; k < e; k++)
for (std::size_t k = 0; k < e; k++)
W(j,p[k]) += W(i,p[k]) * f1;
for (unsigned k = 0; k <= i; k ++)
Ainv(j,k) += Ainv(i,k) * f1;
@ -175,11 +175,11 @@ void matrix_solver_sm_t<m_N, storage_N>::LE_invert()
}
}
/* up */
for (int i = kN - 1; i >= 0; i--)
for (unsigned i = kN; i-- > 0; )
{
/* FIXME: Singular matrix? */
const nl_double f = 1.0 / W(i,i);
for (int j = i - 1; j>=0; j--)
for (unsigned j = i; j-- > 0; )
{
const nl_double f1 = - W(j,i) * f;
if (f1 != 0.0)
@ -219,7 +219,7 @@ void matrix_solver_sm_t<m_N, storage_N>::LE_compute_x(
template <unsigned m_N, unsigned storage_N>
int matrix_solver_sm_t<m_N, storage_N>::solve_non_dynamic(const bool newton_raphson)
unsigned matrix_solver_sm_t<m_N, storage_N>::solve_non_dynamic(const bool newton_raphson)
{
static const bool incremental = true;
static unsigned cnt = 0;
@ -309,7 +309,7 @@ int matrix_solver_sm_t<m_N, storage_N>::solve_non_dynamic(const bool newton_raph
}
template <unsigned m_N, unsigned storage_N>
inline int matrix_solver_sm_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_raphson)
inline unsigned matrix_solver_sm_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_raphson)
{
build_LE_A<matrix_solver_sm_t>();
build_LE_RHS<matrix_solver_sm_t>();
@ -323,7 +323,7 @@ inline int matrix_solver_sm_t<m_N, storage_N>::vsolve_non_dynamic(const bool new
template <unsigned m_N, unsigned storage_N>
matrix_solver_sm_t<m_N, storage_N>::matrix_solver_sm_t(netlist_t &anetlist, const pstring &name,
const solver_parameters_t *params, const int size)
const solver_parameters_t *params, const unsigned size)
: matrix_solver_t(anetlist, name, NOSORT, params)
, m_dim(size)
{

View File

@ -26,7 +26,7 @@ class matrix_solver_SOR_t: public matrix_solver_direct_t<m_N, storage_N>
{
public:
matrix_solver_SOR_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params, int size)
matrix_solver_SOR_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params, const unsigned size)
: matrix_solver_direct_t<m_N, storage_N>(anetlist, name, matrix_solver_t::ASCENDING, params, size)
, m_lp_fact(*this, "m_lp_fact", 0)
{
@ -35,7 +35,7 @@ public:
virtual ~matrix_solver_SOR_t() {}
virtual void vsetup(analog_net_t::list_t &nets) override;
virtual int vsolve_non_dynamic(const bool newton_raphson) override;
virtual unsigned vsolve_non_dynamic(const bool newton_raphson) override;
private:
state_var<nl_double> m_lp_fact;
@ -53,11 +53,11 @@ void matrix_solver_SOR_t<m_N, storage_N>::vsetup(analog_net_t::list_t &nets)
}
template <unsigned m_N, unsigned storage_N>
int matrix_solver_SOR_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_raphson)
unsigned matrix_solver_SOR_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_raphson)
{
const unsigned iN = this->N();
bool resched = false;
int resched_cnt = 0;
unsigned resched_cnt = 0;
/* ideally, we could get an estimate for the spectral radius of
* Inv(D - L) * U
@ -80,7 +80,7 @@ int matrix_solver_SOR_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_ra
nl_double gabs_t = 0.0;
nl_double RHS_t = 0.0;
const unsigned term_count = this->m_terms[k]->count();
const std::size_t term_count = this->m_terms[k]->count();
const nl_double * const RESTRICT gt = this->m_terms[k]->gt();
const nl_double * const RESTRICT go = this->m_terms[k]->go();
const nl_double * const RESTRICT Idr = this->m_terms[k]->Idr();
@ -88,20 +88,20 @@ int matrix_solver_SOR_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_ra
new_V[k] = this->m_nets[k]->m_cur_Analog;
for (unsigned i = 0; i < term_count; i++)
for (std::size_t i = 0; i < term_count; i++)
{
gtot_t = gtot_t + gt[i];
RHS_t = RHS_t + Idr[i];
}
for (unsigned i = this->m_terms[k]->m_railstart; i < term_count; i++)
for (std::size_t i = this->m_terms[k]->m_railstart; i < term_count; i++)
RHS_t = RHS_t + go[i] * *other_cur_analog[i];
RHS[k] = RHS_t;
if (USE_GABS)
{
for (unsigned i = 0; i < term_count; i++)
for (std::size_t i = 0; i < term_count; i++)
gabs_t = gabs_t + std::abs(go[i]);
gabs_t *= NL_FCONST(0.5); // derived by try and error
@ -138,11 +138,11 @@ int matrix_solver_SOR_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_ra
for (unsigned k = 0; k < iN; k++)
{
const int * RESTRICT net_other = this->m_terms[k]->net_other();
const unsigned railstart = this->m_terms[k]->m_railstart;
const std::size_t railstart = this->m_terms[k]->m_railstart;
const nl_double * RESTRICT go = this->m_terms[k]->go();
nl_double Idrive = 0.0;
for (unsigned i = 0; i < railstart; i++)
for (std::size_t i = 0; i < railstart; i++)
Idrive = Idrive + go[i] * new_V[net_other[i]];
const nl_double new_val = new_V[k] * one_m_w[k] + (Idrive + RHS[k]) * w[k];

View File

@ -29,7 +29,7 @@ class matrix_solver_SOR_mat_t: public matrix_solver_direct_t<m_N, storage_N>
public:
matrix_solver_SOR_mat_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params, int size)
matrix_solver_SOR_mat_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params, const unsigned size)
: matrix_solver_direct_t<m_N, storage_N>(anetlist, name, matrix_solver_t::DESCENDING, params, size)
, m_Vdelta(*this, "m_Vdelta", 0.0)
, m_omega(*this, "m_omega", params->m_sor)
@ -43,7 +43,7 @@ public:
virtual void vsetup(analog_net_t::list_t &nets) override;
virtual int vsolve_non_dynamic(const bool newton_raphson) override;
virtual unsigned vsolve_non_dynamic(const bool newton_raphson) override;
private:
state_var<nl_double[storage_N]> m_Vdelta;
@ -114,7 +114,7 @@ nl_double matrix_solver_SOR_mat_t<m_N, storage_N>::vsolve()
#endif
template <unsigned m_N, unsigned storage_N>
int matrix_solver_SOR_mat_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_raphson)
unsigned matrix_solver_SOR_mat_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_raphson)
{
/* The matrix based code looks a lot nicer but actually is 30% slower than
* the optimized code which works directly on the data structures.
@ -130,7 +130,7 @@ int matrix_solver_SOR_mat_t<m_N, storage_N>::vsolve_non_dynamic(const bool newto
bool resched = false;
int resched_cnt = 0;
unsigned resched_cnt = 0;
#if 0
@ -181,9 +181,9 @@ int matrix_solver_SOR_mat_t<m_N, storage_N>::vsolve_non_dynamic(const bool newto
nl_double Idrive = 0;
const auto *p = this->m_terms[k]->m_nz.data();
const unsigned e = this->m_terms[k]->m_nz.size();
const std::size_t e = this->m_terms[k]->m_nz.size();
for (unsigned i = 0; i < e; i++)
for (std::size_t i = 0; i < e; i++)
Idrive = Idrive + this->A(k,p[i]) * new_v[p[i]];
const nl_double delta = m_omega * (this->RHS(k) - Idrive) / this->A(k,k);

View File

@ -60,7 +60,7 @@ class matrix_solver_w_t: public matrix_solver_t
friend class matrix_solver_t;
public:
matrix_solver_w_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params, const int size);
matrix_solver_w_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params, const unsigned size);
virtual ~matrix_solver_w_t();
@ -68,8 +68,8 @@ public:
virtual void reset() override { matrix_solver_t::reset(); }
protected:
virtual int vsolve_non_dynamic(const bool newton_raphson) override;
int solve_non_dynamic(const bool newton_raphson);
virtual unsigned vsolve_non_dynamic(const bool newton_raphson) override;
unsigned solve_non_dynamic(const bool newton_raphson);
inline unsigned N() const { if (m_N == 0) return m_dim; else return m_N; }
@ -164,12 +164,12 @@ void matrix_solver_w_t<m_N, storage_N>::LE_invert()
/* FIXME: Singular matrix? */
const nl_double f = 1.0 / W(i,i);
const auto * RESTRICT const p = m_terms[i]->m_nzrd.data();
const unsigned e = m_terms[i]->m_nzrd.size();
const size_t e = m_terms[i]->m_nzrd.size();
/* Eliminate column i from row j */
const auto * RESTRICT const pb = m_terms[i]->m_nzbd.data();
const unsigned eb = m_terms[i]->m_nzbd.size();
const size_t eb = m_terms[i]->m_nzbd.size();
for (unsigned jb = 0; jb < eb; jb++)
{
const auto j = pb[jb];
@ -184,11 +184,11 @@ void matrix_solver_w_t<m_N, storage_N>::LE_invert()
}
}
/* up */
for (int i = kN - 1; i >= 0; i--)
for (unsigned i = kN; i-- > 0; )
{
/* FIXME: Singular matrix? */
const nl_double f = 1.0 / W(i,i);
for (int j = i - 1; j>=0; j--)
for (unsigned j = i; j-- > 0; )
{
const nl_double f1 = - W(j,i) * f;
if (f1 != 0.0)
@ -227,7 +227,7 @@ void matrix_solver_w_t<m_N, storage_N>::LE_compute_x(
template <unsigned m_N, unsigned storage_N>
int matrix_solver_w_t<m_N, storage_N>::solve_non_dynamic(const bool newton_raphson)
unsigned matrix_solver_w_t<m_N, storage_N>::solve_non_dynamic(const bool newton_raphson)
{
const auto iN = N();
@ -320,7 +320,7 @@ int matrix_solver_w_t<m_N, storage_N>::solve_non_dynamic(const bool newton_raphs
/* Back substitution */
//inv(H) w = t w = H t
nl_double t[storage_N]; // FIXME: convert to member
for (int j = rowcount - 1; j >= 0; j--)
for (unsigned j = rowcount; j-- > 0; )
{
nl_double tmp = 0;
const nl_double *pj = &H[j][j+1];
@ -373,7 +373,7 @@ int matrix_solver_w_t<m_N, storage_N>::solve_non_dynamic(const bool newton_raphs
}
template <unsigned m_N, unsigned storage_N>
inline int matrix_solver_w_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_raphson)
inline unsigned matrix_solver_w_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_raphson)
{
build_LE_A<matrix_solver_w_t>();
build_LE_RHS<matrix_solver_w_t>();
@ -387,7 +387,7 @@ inline int matrix_solver_w_t<m_N, storage_N>::vsolve_non_dynamic(const bool newt
template <unsigned m_N, unsigned storage_N>
matrix_solver_w_t<m_N, storage_N>::matrix_solver_w_t(netlist_t &anetlist, const pstring &name,
const solver_parameters_t *params, const int size)
const solver_parameters_t *params, const unsigned size)
: matrix_solver_t(anetlist, name, NOSORT, params)
,m_cnt(0)
, m_dim(size)

View File

@ -127,9 +127,9 @@ void matrix_solver_t::setup_base(analog_net_t::list_t &nets)
net->set_solver(this);
for (core_terminal_t *p : net->m_core_terms)
for (auto &p : net->m_core_terms)
{
log().debug("{1} {2} {3}\n", p->name(), net->name(), (int) net->isRailNet());
log().debug("{1} {2} {3}\n", p->name(), net->name(), net->isRailNet());
switch (p->type())
{
case terminal_t::TERMINAL:
@ -187,12 +187,12 @@ void matrix_solver_t::setup_base(analog_net_t::list_t &nets)
void matrix_solver_t::setup_matrix()
{
const unsigned iN = m_nets.size();
const std::size_t iN = m_nets.size();
for (unsigned k = 0; k < iN; k++)
for (std::size_t k = 0; k < iN; k++)
{
m_terms[k]->m_railstart = m_terms[k]->count();
for (unsigned i = 0; i < m_rails_temp[k]->count(); i++)
for (std::size_t i = 0; i < m_rails_temp[k]->count(); i++)
this->m_terms[k]->add(m_rails_temp[k]->terms()[i], m_rails_temp[k]->net_other()[i], false);
m_rails_temp[k]->clear(); // no longer needed
@ -231,7 +231,7 @@ void matrix_solver_t::setup_matrix()
for (unsigned k = 0; k < iN - 1; k++)
for (unsigned i = k+1; i < iN; i++)
{
if (((int) m_terms[k]->m_railstart - (int) m_terms[i]->m_railstart) * sort_order < 0)
if ((static_cast<int>(m_terms[k]->m_railstart) - static_cast<int>(m_terms[i]->m_railstart)) * sort_order < 0)
{
std::swap(m_terms[i], m_terms[k]);
std::swap(m_nets[i], m_nets[k]);
@ -257,8 +257,8 @@ void matrix_solver_t::setup_matrix()
t->m_nz.clear();
for (unsigned i = 0; i < t->m_railstart; i++)
if (!plib::container::contains(t->m_nz, other[i]))
t->m_nz.push_back(other[i]);
if (!plib::container::contains(t->m_nz, static_cast<unsigned>(other[i])))
t->m_nz.push_back(static_cast<unsigned>(other[i]));
t->m_nz.push_back(k); // add diagonal
@ -291,8 +291,8 @@ void matrix_solver_t::setup_matrix()
}
for (unsigned i = 0; i < t->m_railstart; i++)
if (!plib::container::contains(t->m_nzrd, other[i]) && other[i] >= (int) (k + 1))
t->m_nzrd.push_back(other[i]);
if (!plib::container::contains(t->m_nzrd, static_cast<unsigned>(other[i])) && other[i] >= static_cast<int>(k + 1))
t->m_nzrd.push_back(static_cast<unsigned>(other[i]));
/* and sort */
std::sort(t->m_nzrd.begin(), t->m_nzrd.end());
@ -369,15 +369,15 @@ void matrix_solver_t::setup_matrix()
void matrix_solver_t::update_inputs()
{
// avoid recursive calls. Inputs are updated outside this call
for (std::size_t i=0; i<m_inps.size(); i++)
m_inps[i]->set_Q(m_inps[i]->m_proxied_net->Q_Analog());
for (auto &inp : m_inps)
inp->push(inp->m_proxied_net->Q_Analog());
}
void matrix_solver_t::update_dynamic()
{
/* update all non-linear devices */
for (std::size_t i=0; i < m_dynamic_devices.size(); i++)
m_dynamic_devices[i]->update_terminals();
for (auto &dyn : m_dynamic_devices)
dyn->update_terminals();
}
void matrix_solver_t::reset()
@ -419,8 +419,8 @@ void matrix_solver_t::solve_base()
m_stat_vsolver_calls++;
if (has_dynamic_devices())
{
int this_resched;
int newton_loops = 0;
unsigned this_resched;
unsigned newton_loops = 0;
do
{
update_dynamic();
@ -465,15 +465,15 @@ const netlist_time matrix_solver_t::solve()
return next_time_step;
}
int matrix_solver_t::get_net_idx(net_t *net)
int matrix_solver_t::get_net_idx(detail::net_t *net)
{
for (std::size_t k = 0; k < m_nets.size(); k++)
if (m_nets[k] == net)
return k;
return static_cast<int>(k);
return -1;
}
void matrix_solver_t::add_term(int k, terminal_t *term)
void matrix_solver_t::add_term(std::size_t k, terminal_t *term)
{
if (term->m_otherterm->net().isRailNet())
{
@ -505,7 +505,7 @@ netlist_time matrix_solver_t::compute_next_timestep(const double cur_ts)
* FIXME: We should extend the logic to use either all nets or
* only output nets.
*/
for (unsigned k = 0, iN=m_terms.size(); k < iN; k++)
for (std::size_t k = 0, iN=m_terms.size(); k < iN; k++)
{
analog_net_t *n = m_nets[k];
terms_t *t = m_terms[k];
@ -550,28 +550,23 @@ void matrix_solver_t::log_stats()
log().verbose(" ==> {1} nets", this->m_nets.size()); //, (*(*groups[i].first())->m_core_terms.first())->name());
log().verbose(" has {1} elements", this->has_dynamic_devices() ? "dynamic" : "no dynamic");
log().verbose(" has {1} elements", this->has_timestep_devices() ? "timestep" : "no timestep");
log().verbose(" {1:6.3} average newton raphson loops", (double) this->m_stat_newton_raphson / (double) this->m_stat_vsolver_calls);
log().verbose(" {1:10} invocations ({2:6} Hz) {3:10} gs fails ({4:6.2} %) {5:6.3} average",
log().verbose(" {1:6.3} average newton raphson loops",
static_cast<double>(this->m_stat_newton_raphson) / static_cast<double>(this->m_stat_vsolver_calls));
log().verbose(" {1:10} invocations ({2:6.0} Hz) {3:10} gs fails ({4:6.2} %) {5:6.3} average",
this->m_stat_calculations(),
this->m_stat_calculations() * 10 / (int) (this->netlist().time().as_double() * 10.0),
static_cast<double>(this->m_stat_calculations()) / this->netlist().time().as_double(),
this->m_iterative_fail(),
100.0 * (double) this->m_iterative_fail() / (double) this->m_stat_calculations(),
(double) this->m_iterative_total() / (double) this->m_stat_calculations());
100.0 * static_cast<double>(this->m_iterative_fail())
/ static_cast<double>(this->m_stat_calculations()),
static_cast<double>(this->m_iterative_total()) / static_cast<double>(this->m_stat_calculations()));
}
}
// ----------------------------------------------------------------------------------------
// solver
// ----------------------------------------------------------------------------------------
NETLIB_RESET(solver)
{
for (std::size_t i = 0; i < m_mat_solvers.size(); i++)
@ -596,7 +591,7 @@ NETLIB_UPDATE(solver)
#if HAS_OPENMP && USE_OPENMP
const std::size_t t_cnt = m_mat_solvers.size();
if (m_parallel.Value())
if (m_parallel())
{
omp_set_num_threads(3);
//omp_set_dynamic(0);
@ -634,7 +629,7 @@ NETLIB_UPDATE(solver)
}
template <int m_N, int storage_N>
std::unique_ptr<matrix_solver_t> NETLIB_NAME(solver)::create_solver(int size, const bool use_specific)
std::unique_ptr<matrix_solver_t> NETLIB_NAME(solver)::create_solver(unsigned size, const bool use_specific)
{
pstring solvername = plib::pfmt("Solver_{1}")(m_mat_solvers.size());
if (use_specific && m_N == 1)
@ -643,48 +638,48 @@ std::unique_ptr<matrix_solver_t> NETLIB_NAME(solver)::create_solver(int size, co
return plib::make_unique<matrix_solver_direct2_t>(netlist(), solvername, &m_params);
else
{
if (size >= m_gs_threshold)
if (static_cast<int>(size) >= m_gs_threshold())
{
if (pstring("SOR_MAT").equals(m_iterative_solver))
if (pstring("SOR_MAT").equals(m_iterative_solver()))
{
typedef matrix_solver_SOR_mat_t<m_N,storage_N> solver_sor_mat;
return plib::make_unique<solver_sor_mat>(netlist(), solvername, &m_params, size);
}
else if (pstring("MAT_CR").equals(m_iterative_solver))
else if (pstring("MAT_CR").equals(m_iterative_solver()))
{
typedef matrix_solver_GCR_t<m_N,storage_N> solver_mat;
return plib::make_unique<solver_mat>(netlist(), solvername, &m_params, size);
}
else if (pstring("MAT").equals(m_iterative_solver))
else if (pstring("MAT").equals(m_iterative_solver()))
{
typedef matrix_solver_direct_t<m_N,storage_N> solver_mat;
return plib::make_unique<solver_mat>(netlist(), solvername, &m_params, size);
}
else if (pstring("SM").equals(m_iterative_solver))
else if (pstring("SM").equals(m_iterative_solver()))
{
/* Sherman-Morrison Formula */
typedef matrix_solver_sm_t<m_N,storage_N> solver_mat;
return plib::make_unique<solver_mat>(netlist(), solvername, &m_params, size);
}
else if (pstring("W").equals(m_iterative_solver))
else if (pstring("W").equals(m_iterative_solver()))
{
/* Woodbury Formula */
typedef matrix_solver_w_t<m_N,storage_N> solver_mat;
return plib::make_unique<solver_mat>(netlist(), solvername, &m_params, size);
}
else if (pstring("SOR").equals(m_iterative_solver))
else if (pstring("SOR").equals(m_iterative_solver()))
{
typedef matrix_solver_SOR_t<m_N,storage_N> solver_GS;
return plib::make_unique<solver_GS>(netlist(), solvername, &m_params, size);
}
else if (pstring("GMRES").equals(m_iterative_solver))
else if (pstring("GMRES").equals(m_iterative_solver()))
{
typedef matrix_solver_GMRES_t<m_N,storage_N> solver_GMRES;
return plib::make_unique<solver_GMRES>(netlist(), solvername, &m_params, size);
}
else
{
netlist().log().fatal("Unknown solver type: {1}\n", m_iterative_solver.Value());
netlist().log().fatal("Unknown solver type: {1}\n", m_iterative_solver());
return nullptr;
}
}
@ -701,17 +696,18 @@ void NETLIB_NAME(solver)::post_start()
std::vector<analog_net_t::list_t> groups;
const bool use_specific = true;
m_params.m_pivot = m_pivot.Value();
m_params.m_accuracy = m_accuracy.Value();
m_params.m_gs_loops = m_gs_loops.Value();
m_params.m_nr_loops = m_nr_loops.Value();
m_params.m_nt_sync_delay = netlist_time::from_double(m_sync_delay.Value());
m_params.m_lte = m_lte.Value();
m_params.m_sor = m_sor.Value();
m_params.m_pivot = m_pivot();
m_params.m_accuracy = m_accuracy();
/* FIXME: Throw when negative */
m_params.m_gs_loops = static_cast<unsigned>(m_gs_loops());
m_params.m_nr_loops = static_cast<unsigned>(m_nr_loops());
m_params.m_nt_sync_delay = netlist_time::from_double(m_sync_delay());
m_params.m_lte = m_lte();
m_params.m_sor = m_sor();
m_params.m_min_timestep = m_min_timestep.Value();
m_params.m_dynamic = (m_dynamic.Value() == 1 ? true : false);
m_params.m_max_timestep = netlist_time::from_hz(m_freq.Value()).as_double();
m_params.m_min_timestep = m_min_timestep();
m_params.m_dynamic = (m_dynamic() == 1 ? true : false);
m_params.m_max_timestep = netlist_time::from_double(1.0 / m_freq()).as_double();
if (m_params.m_dynamic)
{
@ -727,9 +723,9 @@ void NETLIB_NAME(solver)::post_start()
// Override log statistics
pstring p = plib::util::environment("NL_STATS");
if (p != "")
m_params.m_log_stats = (bool) p.as_long();
m_params.m_log_stats = p.as_long();
else
m_params.m_log_stats = (bool) m_log_stats.Value();
m_params.m_log_stats = m_log_stats();
netlist().log().verbose("Scanning net groups ...");
// determine net groups
@ -754,7 +750,7 @@ void NETLIB_NAME(solver)::post_start()
for (auto & grp : groups)
{
std::unique_ptr<matrix_solver_t> ms;
std::size_t net_count = grp.size();
unsigned net_count = static_cast<unsigned>(grp.size());
switch (net_count)
{
@ -806,7 +802,7 @@ void NETLIB_NAME(solver)::post_start()
break;
#endif
default:
netlist().log().warning("No specific solver found for netlist of size {1}", (unsigned) net_count);
netlist().log().warning("No specific solver found for netlist of size {1}", net_count);
if (net_count <= 16)
{
ms = create_solver<0,16>(net_count, use_specific);
@ -841,10 +837,10 @@ void NETLIB_NAME(solver)::post_start()
netlist().log().verbose(" ==> {2} nets", grp.size());
netlist().log().verbose(" has {1} elements", ms->has_dynamic_devices() ? "dynamic" : "no dynamic");
netlist().log().verbose(" has {1} elements", ms->has_timestep_devices() ? "timestep" : "no timestep");
for (net_t *n : grp)
for (auto &n : grp)
{
netlist().log().verbose("Net {1}", n->name());
for (const core_terminal_t *pcore : n->m_core_terms)
for (const auto &pcore : n->m_core_terms)
{
netlist().log().verbose(" {1}", pcore->name());
}

View File

@ -75,7 +75,7 @@ NETLIB_OBJECT(solver)
void post_start();
void stop() override;
inline nl_double gmin() { return m_gmin.Value(); }
inline nl_double gmin() { return m_gmin(); }
void create_solver_code(plib::postream &strm);
@ -111,7 +111,7 @@ private:
solver_parameters_t m_params;
template <int m_N, int storage_N>
std::unique_ptr<matrix_solver_t> create_solver(int size, bool use_specific);
std::unique_ptr<matrix_solver_t> create_solver(unsigned size, bool use_specific);
};
} //namespace devices

View File

@ -153,12 +153,11 @@ double nl_convert_base_t::get_sp_unit(const pstring &unit)
double nl_convert_base_t::get_sp_val(const pstring &sin)
{
int p = sin.len() - 1;
while (p>=0 && (sin.substr(p,1) < "0" || sin.substr(p,1) > "9"))
p--;
pstring val = sin.substr(0,p + 1);
pstring unit = sin.substr(p + 1);
auto p = sin.begin();
while (p != sin.end() && (m_numberchars.find(*p) != m_numberchars.end()))
++p;
pstring val = sin.left(p);
pstring unit = sin.substr(p);
double ret = get_sp_unit(unit) * val.as_double();
return ret;
}
@ -223,7 +222,7 @@ void nl_convert_spice_t::process_line(const pstring &line)
switch (tt[0].code_at(0))
{
case ';':
out("// {}\n", line.substr(1).cstr());
out("// {}\n", line.substr(1));
break;
case '*':
out("// {}\n", line.substr(1).cstr());
@ -249,7 +248,7 @@ void nl_convert_spice_t::process_line(const pstring &line)
/* check for fourth terminal ... should be numeric net
* including "0" or start with "N" (ltspice)
*/
ATTR_UNUSED int nval =tt[4].as_long(&cerr);
ATTR_UNUSED long nval =tt[4].as_long(&cerr);
pstring model;
pstring pins ="CBE";
@ -262,7 +261,7 @@ void nl_convert_spice_t::process_line(const pstring &line)
{
if (m[1].len() != 4)
fprintf(stderr, "error with model desc %s\n", model.cstr());
pins = m[1].left(3);
pins = m[1].left(m[1].begin() + 3);
}
add_device("QBJT_EB", tt[0], m[0]);
add_term(tt[1], tt[0] + "." + pins.code_at(0));

View File

@ -23,7 +23,7 @@ class nl_convert_base_t
{
public:
nl_convert_base_t() : out(m_buf) {}
nl_convert_base_t() : out(m_buf), m_numberchars("0123456789-+e.") {}
virtual ~nl_convert_base_t()
{
m_nets.clear();
@ -136,6 +136,7 @@ private:
std::unordered_map<pstring, std::unique_ptr<pin_alias_t>> m_pins;
static unit_t m_units[];
pstring m_numberchars;
};