diff --git a/examples/memristor/memristor_x.sp b/examples/memristor/memristor_x.sp index 374b9772a..fec6076ed 100644 --- a/examples/memristor/memristor_x.sp +++ b/examples/memristor/memristor_x.sp @@ -6,8 +6,10 @@ Memristor with threshold as XSPICE code model * XSPICE code model, parameter selection and plotting by * Holger Vogt 2012 +* ac and op (dc) simulation just use start resistance rinit! + .param stime=10n -.param vmax = 3 +.param vmax = 4.5 * send parameters to the .control section .csparam stime={stime} @@ -16,15 +18,16 @@ Memristor with threshold as XSPICE code model *Xmem 1 0 memristor * triangular sweep (you have to adapt the parameters to 'alter' command in the .control section) *V1 1 0 DC 0 PWL(0 0 '0.25*stime' 'vmax' '0.5*stime' 0 '0.75*stime' '-vmax' 'stime' 0) -* sinusoidal sweep -V1 0 1 DC 0 sin(0 'vmax' '1/stime') +* sinusoidal sweep for transient, dc for op, ac +V1 0 1 DC 0.1 ac 1 sin(0 'vmax' '1/stime') +Rl 1 11 1k * memristor model with limits and threshold * "artificial" parameters alpha, beta, and vt. beta and vt adapted to basic programming frequency * just to obtain nice results! * You have to care for the physics and set real values! -amen 1 2 memr +amen 11 2 memr .model memr memristor (rmin=1k rmax=10k rinit=7k alpha=0 beta='20e3/stime' vt=1.6) vgnd 2 0 dc 0 @@ -41,6 +44,10 @@ Rmem plus minus r={V(x)} * transient simulation same programming voltage but rising frequencies .control *** first simulation *** +op +print all +ac lin 101 1 100k +plot v(11) * approx. 100 simulation points let deltime = stime/100 tran $&deltime $&stime uic diff --git a/src/xspice/icm/xtradev/memristor/cfunc.mod b/src/xspice/icm/xtradev/memristor/cfunc.mod index 62c30750e..9a9964a4d 100644 --- a/src/xspice/icm/xtradev/memristor/cfunc.mod +++ b/src/xspice/icm/xtradev/memristor/cfunc.mod @@ -28,6 +28,8 @@ SUMMARY ** Experimental, still to be tested in circuits !! ** + dc and ac simulation just return rinit. + INTERFACES cm_memristor() @@ -56,7 +58,7 @@ double f1(double y); void cm_memristor (ARGS) { -// Complex_t ac_gain; + Complex_t ac_gain; double partial; double int_value; double *rval; @@ -91,14 +93,19 @@ void cm_memristor (ARGS) cm_analog_integrate(int_value, rval, &partial); /* output the current */ OUTPUT(memris) = INPUT(memris) / *rval; + /* This does work, but is questionable */ PARTIAL(memris, memris) = partial; + /* This may be a (safe?) replacement, but in fact is not + so good at high voltage (at strong non-linearity) + cm_analog_auto_partial();*/ } -/* no AC and DC modeling so far ! else if(ANALYSIS == AC) { - ac_gain.real = *vc; + ac_gain.real = 1/ *rval; ac_gain.imag = 0.0; AC_GAIN(memris, memris) = ac_gain; - } */ + } + else + OUTPUT(memris) = INPUT(memris) / *rval; } /* the window function */