void resistor::initTR (void) { initDC (); } void resistor::calcTR (nr_double_t) { calcDC (); } // Initialize computation of MNA matrix entries for HB. void resistor::initHB (void) { initModel (); nr_double_t r = getScaledProperty ("R"); setVoltageSources (1); setInternalVoltageSource (1); allocMatrixMNA (); voltageSource (VSRC_1, NODE_1, NODE_2); setD (VSRC_1, VSRC_1, -r); } // properties PROP_REQ [] = { { "R", PROP_REAL, { 50, PROP_NO_STR }, PROP_NO_RANGE }, PROP_NO_PROP }; PROP_OPT [] = { { "Temp", PROP_REAL, { 26.85, PROP_NO_STR }, PROP_MIN_VAL (K) }, { "Tc1", PROP_REAL, { 0, PROP_NO_STR }, PROP_NO_RANGE }, { "Tc2", PROP_REAL, { 0, PROP_NO_STR }, PROP_NO_RANGE }, { "Tnom", PROP_REAL, { 26.85, PROP_NO_STR }, PROP_MIN_VAL (K) }, PROP_NO_PROP }; struct define_t resistor::cirdef = { "R", 2, PROP_COMPONENT, PROP_NO_SUBSTRATE, PROP_LINEAR, PROP_DEF };
setE (VSRC_1, Uin * gv - Uout); } void opamp::calcOperatingPoints (void) { setOperatingPoint ("g", gv); } void opamp::initAC (void) { initDC (); setC (VSRC_1, NODE_INP, +gv); setC (VSRC_1, NODE_INM, -gv); } void opamp::initTR (void) { initDC (); } void opamp::calcTR (nr_double_t) { calcDC (); } // properties PROP_REQ [] = { { "G", PROP_REAL, { 1e6, PROP_NO_STR }, PROP_MIN_VAL (1) }, PROP_NO_PROP }; PROP_OPT [] = { { "Umax", PROP_REAL, { 15, PROP_NO_STR }, PROP_POS_RANGE }, PROP_NO_PROP }; struct define_t opamp::cirdef = { "OpAmp", 3, PROP_COMPONENT, PROP_NO_SUBSTRATE, PROP_NONLINEAR, PROP_DEF };
void amplifier::calcNoiseAC (nr_double_t) { nr_double_t g = getPropertyDouble ("G"); nr_double_t z2 = getPropertyDouble ("Z2"); nr_double_t NF = getPropertyDouble ("NF"); setN (NODE_1, NODE_1, 0); setN (NODE_2, NODE_2, 4 * sqr (g) * (NF - 1) / z2); setN (NODE_1, NODE_2, 0); setN (NODE_2, NODE_1, 0); } /*! Transient model initialization. Idem than DC model. */ void amplifier::initTR (void) { initDC (); } // properties PROP_REQ [] = { { "G", PROP_REAL, { 10, PROP_NO_STR }, PROP_MIN_VAL (1) }, PROP_NO_PROP }; PROP_OPT [] = { { "Z1", PROP_REAL, { 50, PROP_NO_STR }, PROP_POS_RANGE }, { "Z2", PROP_REAL, { 50, PROP_NO_STR }, PROP_POS_RANGE }, { "NF", PROP_REAL, { 1, PROP_NO_STR }, PROP_MIN_VAL (1) }, PROP_NO_PROP }; struct define_t amplifier::cirdef = { "Amp", 2, PROP_COMPONENT, PROP_NO_SUBSTRATE, PROP_LINEAR, PROP_DEF };
convHelper = CONV_None; eqnAlgo = ALGO_LU_SUBSTITUTION_CROUT; // compute noise voltage for each node (and voltage source) for (int i = 0; i < N + M; i++) { z->set (0); z->set (i, -1); // modify right hand side appropriately runMNA (); // solve zn = *x; // save transimpedance vector // compute actual noise voltage xn->set (i, sqrt (real (scalar (zn * (*C), conj (zn))))); } // restore usual AC results *x = xsave; } // properties PROP_REQ [] = { { "Type", PROP_STR, { PROP_NO_VAL, "lin" }, PROP_RNG_TYP }, PROP_NO_PROP }; PROP_OPT [] = { { "Noise", PROP_STR, { PROP_NO_VAL, "no" }, PROP_RNG_YESNO }, { "Start", PROP_REAL, { 1e9, PROP_NO_STR }, PROP_POS_RANGE }, { "Stop", PROP_REAL, { 10e9, PROP_NO_STR }, PROP_POS_RANGE }, { "Points", PROP_INT, { 10, PROP_NO_STR }, PROP_MIN_VAL (2) }, { "Values", PROP_LIST, { 10, PROP_NO_STR }, PROP_POS_RANGE }, PROP_NO_PROP }; struct define_t acsolver::anadef = { "AC", 0, PROP_ACTION, PROP_NO_SUBSTRATE, PROP_LINEAR, PROP_DEF };