summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/analog/nld_opamps.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/analog/nld_opamps.cpp')
-rw-r--r--src/lib/netlist/analog/nld_opamps.cpp64
1 files changed, 42 insertions, 22 deletions
diff --git a/src/lib/netlist/analog/nld_opamps.cpp b/src/lib/netlist/analog/nld_opamps.cpp
index 8c3c655bfa9..0539a5dea51 100644
--- a/src/lib/netlist/analog/nld_opamps.cpp
+++ b/src/lib/netlist/analog/nld_opamps.cpp
@@ -115,6 +115,8 @@ namespace netlist
, m_VREF(*this, "VREF")
{
m_type = static_cast<int>(m_model.m_TYPE);
+ if (m_type < 1 || m_type > 3)
+ log().fatal(MF_1_UNKNOWN_OPAMP_TYPE, m_type);
if (m_type == 1)
{
@@ -127,38 +129,42 @@ namespace netlist
connect("RP1.1", "G1.OP");
}
- else if (m_type == 3)
+ if (m_type == 2 || m_type == 3)
{
create_and_register_subdevice("CP1", m_CP);
create_and_register_subdevice("EBUF", m_EBUF);
- create_and_register_subdevice("DN", m_DN, "D(IS=1e-15 N=1)");
- create_and_register_subdevice("DP", m_DP, "D(IS=1e-15 N=1)");
-
- //m_DP->m_model.setTo("D(IS=1e-15 N=1)");
- //m_DN->m_model.setTo("D(IS=1e-15 N=1)");
register_subalias("PLUS", "G1.IP");
register_subalias("MINUS", "G1.IN");
- register_subalias("OUT", "EBUF.OP");
-
- connect("EBUF.ON", "VREF");
connect("G1.ON", "VREF");
connect("RP1.2", "VREF");
connect("CP1.2", "VREF");
+ connect("EBUF.ON", "VREF");
connect("EBUF.IN", "VREF");
connect("RP1.1", "G1.OP");
connect("CP1.1", "RP1.1");
+ connect("EBUF.IP", "RP1.1");
+ }
+ if (m_type == 2)
+ {
+ register_subalias("OUT", "EBUF.OP");
+ }
+ if (m_type == 3)
+ {
+
+ create_and_register_subdevice("DN", m_DN, "D(IS=1e-15 N=1)");
+ create_and_register_subdevice("DP", m_DP, "D(IS=1e-15 N=1)");
+
connect("DP.K", "VH");
connect("VL", "DN.A");
connect("DP.A", "DN.K");
connect("DN.K", "RP1.1");
- connect("EBUF.IP", "RP1.1");
+
+ register_subalias("OUT", "EBUF.OP");
}
- else
- log().fatal(MF_1_UNKNOWN_OPAMP_TYPE, m_type);
}
@@ -194,6 +200,7 @@ namespace netlist
const double cVt = 0.0258 * 1.0; // * m_n;
const double cId = m_model.m_DAB; // 3 mA
const double cVd = cVt * std::log(cId / 1e-15 + 1.0);
+
m_VH.push(m_VCC() - m_model.m_VLH - cVd);
m_VL.push(m_GND() + m_model.m_VLL + cVd);
m_VREF.push((m_VCC() + m_GND()) / 2.0);
@@ -211,28 +218,41 @@ namespace netlist
m_RP.set_R(RO);
m_G1.m_G.setTo(G);
}
- else if (m_type == 3)
+ if (m_type == 3 || m_type == 2)
{
m_EBUF->reset();
- m_DP->reset();
- m_DN->reset();
m_CP->reset();
m_RP.reset();
-
- m_EBUF->m_G.setTo(1.0);
- m_EBUF->m_RO.setTo(m_model.m_RO);
-
+#if 0
+ double CP = 0.0;
+ double RP = 1000;
+ double G = m_model.m_UGF / m_model.m_FPF / RP;
+#else
double CP = m_model.m_DAB / m_model.m_SLEW;
- double RP = 0.5 / 3.1459 / CP / m_model.m_FPF;
+ double RP = 0.5 / constants::pi() / CP / m_model.m_FPF;
double G = m_model.m_UGF / m_model.m_FPF / RP;
-
- //printf("Min Freq %s: %f\n", name().c_str(), 1.0 / (CP*RP / (G*RP)));
+#endif
+ printf("OPAMP %s: %g %g %g\n", name().c_str(), CP, RP, G);
+ if (m_model.m_SLEW / (4.0 * constants::pi() * 0.0258) < m_model.m_UGF)
+ printf("failed!\n");
m_CP->m_C.setTo(CP);
m_RP.set_R(RP);
m_G1.m_G.setTo(G);
}
+ if (m_type == 2)
+ {
+ m_EBUF->m_G.setTo(1.0);
+ m_EBUF->m_RO.setTo(m_model.m_RO);
+ }
+ if (m_type == 3)
+ {
+ m_DP->reset();
+ m_DN->reset();
+ m_EBUF->m_G.setTo(1.0);
+ m_EBUF->m_RO.setTo(m_model.m_RO);
+ }
}