Browse Source
Add a generator for SEE (single event effects) pulses as a code model.
Add a generator for SEE (single event effects) pulses as a code model.
To be used like aseegen1 NULL [%id(xcell.n1 m1) %id(xcell.n2 m2) %id(xcell.n1 m1) %id(xcell.n2 m2)] seemod1 .model seemod1 seegen (tdelay = 11n tperiod=25n tfall='tfall' trise='trise' let='let' cdepth='d') see README.SEEgenerator for detailspre-master-46
20 changed files with 1185 additions and 0 deletions
-
173README.SEEgenerator
-
33examples/xspice/see/CMOSOpAmp/CMOS-OP1.cir
-
13examples/xspice/see/CMOSOpAmp/cmos_sub.mod
-
46examples/xspice/see/CMOSOpAmp/modelcard.nmos
-
38examples/xspice/see/CMOSOpAmp/modelcard.pmos
-
10examples/xspice/see/CMOSOpAmp/seegen4.mod
-
45examples/xspice/see/ihp_inverter_set.net
-
61examples/xspice/see/ihp_simple_sram_seegen.net
-
60examples/xspice/see/ihp_simple_sram_seegen_ctrl.net
-
69examples/xspice/see/ihp_simple_sram_seegen_subckt.net
-
81examples/xspice/see/ihp_simple_sram_seegen_subckt_vary.net
-
64examples/xspice/see/ihp_simple_sram_set.net
-
48examples/xspice/see/ihp_two_inverters_set.net
-
41examples/xspice/see/repeat_loop_seegen.net
-
22examples/xspice/see/seegen_cm1.cir
-
23examples/xspice/see/set1.cir
-
1src/xspice/icm/xtradev/modpath.lst
-
231src/xspice/icm/xtradev/seegenerator/cfunc.mod
-
120src/xspice/icm/xtradev/seegenerator/ifspec.ifs
-
6visualc/xspice/xtradev.vcxproj
@ -0,0 +1,173 @@ |
|||||
|
SEE (single event effects) generator |
||||
|
|
||||
|
The SEE generator generates current pulses, which resemble the |
||||
|
charge generation and flow causes by a penetrating particle. |
||||
|
|
||||
|
How to use it: |
||||
|
Select LET and charge collection depth cdepth, define them as parameters. |
||||
|
Identify all nodes of a circuit netlist which are pn junctions, |
||||
|
and thus are sensitive to pulses. |
||||
|
|
||||
|
Set up the SEEgenerator by adding for example |
||||
|
|
||||
|
* charge collection depth (in µm) |
||||
|
.param d = 1 |
||||
|
* LET (linear energy transfer) in MeV*cm²/mg |
||||
|
.param let = 12 |
||||
|
aseegen1 NULL [%id(xcell.n1 m1) %id(xcell.n2 m2) %id(xcell.n1 m1) %id(xcell.n2 m2)] seemod1 |
||||
|
.model seemod1 seegen (tdelay = 11n tperiod=25n let='let' cdepth='d') |
||||
|
|
||||
|
to the netlist. |
||||
|
|
||||
|
Each sensitive node from the (flattend) netlist may be added to assegen1, together with its |
||||
|
reference node, for example GND for NMOS, nwell potential for PMOS. This procedure is |
||||
|
currently to be done manually, an automated setup is in preparation. |
||||
|
|
||||
|
After a transient simulation, plotting the data output versus a non-radiated device |
||||
|
may reveal the SEE influence. |
||||
|
|
||||
|
Several examples are gieven in ./src/axamples/xspice/see: inverters, SRAM cell, opamp, |
||||
|
also as loop with varying LET to detect the threshold. |
||||
|
|
||||
|
As literature please see for example |
||||
|
Ygor Quadros de Aguiar, Frédéric Wrobel. Jean-Luc Autran, Rubén García Alía |
||||
|
Single-Event Effects, from Space to Accelerator Environments |
||||
|
Springer 2025 |
||||
|
|
||||
|
Detailed description (will be added to the manual): |
||||
|
|
||||
|
NAME_TABLE: |
||||
|
|
||||
|
C_Function_Name: cm_seegen |
||||
|
Spice_Model_Name: seegen |
||||
|
Description: "single event effect generator" |
||||
|
|
||||
|
|
||||
|
PORT_TABLE: |
||||
|
|
||||
|
Port_Name: ctrl out |
||||
|
Description: "control input" "output" |
||||
|
Direction: in out |
||||
|
Default_Type: v i |
||||
|
Allowed_Types: [v,vd,i,id] [i,id] |
||||
|
Vector: no yes |
||||
|
Vector_Bounds: - [1 -] |
||||
|
Null_Allowed: yes no |
||||
|
|
||||
|
|
||||
|
PARAMETER_TABLE: |
||||
|
|
||||
|
Parameter_Name: tfall trise |
||||
|
Description: "pulse fall time" "pulse rise time" |
||||
|
Data_Type: real real |
||||
|
Default_Value: 500e-12 20e-12 |
||||
|
Limits: - - |
||||
|
Vector: no no |
||||
|
Vector_Bounds: - - |
||||
|
Null_Allowed: yes yes |
||||
|
|
||||
|
|
||||
|
PARAMETER_TABLE: |
||||
|
|
||||
|
Parameter_Name: tdelay inull |
||||
|
Description: "pulse delay" "max current" |
||||
|
Data_Type: real real |
||||
|
Default_Value: 0 0 |
||||
|
Limits: - - |
||||
|
Vector: no no |
||||
|
Vector_Bounds: - - |
||||
|
Null_Allowed: yes yes |
||||
|
|
||||
|
|
||||
|
PARAMETER_TABLE: |
||||
|
|
||||
|
Parameter_Name: tperiod ctrlthres |
||||
|
Description: "pulse repetition" "control voltage threshold" |
||||
|
Data_Type: real real |
||||
|
Default_Value: 0 0.5 |
||||
|
Limits: - - |
||||
|
Vector: no no |
||||
|
Vector_Bounds: - - |
||||
|
Null_Allowed: yes yes |
||||
|
|
||||
|
|
||||
|
PARAMETER_TABLE: |
||||
|
|
||||
|
Parameter_Name: let cdepth |
||||
|
Description: "lin energy transfer" "charge collection depth" |
||||
|
Data_Type: real real |
||||
|
Default_Value: 10 1 |
||||
|
Limits: - - |
||||
|
Vector: no no |
||||
|
Vector_Bounds: - - |
||||
|
Null_Allowed: yes yes |
||||
|
|
||||
|
|
||||
|
PARAMETER_TABLE: |
||||
|
|
||||
|
Parameter_Name: angle perlim |
||||
|
Description: "particle angle" "pulse repetition" |
||||
|
Data_Type: real boolean |
||||
|
Default_Value: 0 TRUE |
||||
|
Limits: [0 1.57079] - |
||||
|
Vector: no no |
||||
|
Vector_Bounds: - - |
||||
|
Null_Allowed: yes yes |
||||
|
|
||||
|
STATIC_VAR_TABLE: |
||||
|
|
||||
|
Static_Var_Name: last_t_value |
||||
|
Data_Type: pointer |
||||
|
Vector: no |
||||
|
Description: "next pulse start time" |
||||
|
|
||||
|
STATIC_VAR_TABLE: |
||||
|
|
||||
|
Static_Var_Name: pulse_number |
||||
|
Data_Type: pointer |
||||
|
Vector: no |
||||
|
Description: "number of pulse" |
||||
|
|
||||
|
STATIC_VAR_TABLE: |
||||
|
|
||||
|
Static_Var_Name: last_ctrl |
||||
|
Data_Type: pointer |
||||
|
Vector: no |
||||
|
Description: "last control value" |
||||
|
|
||||
|
Description |
||||
|
This code model generates "double exponentially" formed current pulses according to |
||||
|
|
||||
|
i(t) = inull * (exp(-(t-tdelay)/tfall) - (exp(-(t-tdelay)/trise) for t > tdelay |
||||
|
i(t) = 0 for t < tdelay |
||||
|
|
||||
|
with inull given as parameter input or (if not given), calculated as |
||||
|
inull = 1.035e-14 * let/cos(angle) * cdepth / (tfall - trise) |
||||
|
with data for silicon, cdepth in µm, let in MeV*cm²/mg, angle in radians. |
||||
|
|
||||
|
Minimum is one pulse output (a node pair, or a single node with the other grounded). |
||||
|
Several output node pairs may be defined per code model instance. Parameter tperiod |
||||
|
may then be used to create pulses in sequence. Per default only one sequence is running, |
||||
|
with one pulse for each node. |
||||
|
Parameter perlim, set to FALSE, allows running and repeating the sequence until |
||||
|
the end of the simulation. The first pulse is issued in the first |
||||
|
node pair of the node list in the vector [], the second (after time tperiod has elapsed), |
||||
|
is injected by the second node (pair) of the list and so on. When the sequence is repeated, |
||||
|
again the output starts pulsing at port (node pair) number 1. |
||||
|
|
||||
|
The control input ctrl (voltage or current) may be used |
||||
|
to start or repeat the whole sequence, depending on the circuit status. A rising voltage |
||||
|
at ctrl, when crossing the threshold given by ctrlthres, will initiate the sequence (including |
||||
|
tdelay and tperiod). |
||||
|
|
||||
|
This model will work in transient analysis. |
||||
|
|
||||
|
Example ngspice usage (with control) |
||||
|
|
||||
|
aseegen1 ctrl [%id(n1 m1) %id(n2 m2) %id(n1 m1) %id(n2 m2)] seemod1 |
||||
|
.model seemod1 seegen (tdelay = 8n tperiod=25n) |
||||
|
|
||||
|
Example ngspice usage (without control, ctrl replaced by NULL, parameters as offered by default) |
||||
|
|
||||
|
aseegen2 NULL [%id(n1 m1) %id(n5 n6) %id(n6 n7) %i(isingle) ] seemod2 |
||||
|
.model seemod2 seegen (tdelay = 0 tperiod=0 ctrlthres=0.5 inull=0 tfall=500p trise=20p perlim=FALSE) |
||||
@ -0,0 +1,33 @@ |
|||||
|
.title KiCad schematic |
||||
|
.include "cmos_sub.mod" |
||||
|
.include "seegen4.mod" |
||||
|
V1 Vcc 0 DC 3.3 |
||||
|
XU1 VGP2 VGP4P8 Vbias VSN4N8 seegen4 |
||||
|
XMN9 Vbias Vbias 0 0 NCH W=5u L=1.4u |
||||
|
V5 in+ 0 DC 1.65 |
||||
|
R1 out in- 100k |
||||
|
R2 in in- 20k |
||||
|
V4 in 0 DC 1.65 SIN( 1.65 100m 1k 0 0 0 ) AC 1 |
||||
|
XMN3 out Vbias 0 0 NCH W=17.4u L=1.4u |
||||
|
C2 out 0 2p |
||||
|
XMP2 out VGP2 Vcc Vcc PCH W=14.5u L=1.4u |
||||
|
C1 VGP2 out 1.2p |
||||
|
XMP4 VGP4P8 VGP4P8 Vcc Vcc PCH W=2.8u L=1.4u |
||||
|
I1 Vcc Vbias 12u |
||||
|
XMN4 VGP4P8 in- VSN4N8 0 NCH W=2.8u L=1.4u |
||||
|
XMN8 VGP2 in+ VSN4N8 0 NCH W=2.8u L=1.4u |
||||
|
XMN2 VSN4N8 Vbias 0 0 NCH W=5u L=1.4u |
||||
|
XMP8 VGP2 VGP4P8 Vcc Vcc PCH W=2.8u L=1.4u |
||||
|
|
||||
|
.control |
||||
|
set xbrushwidth=2 |
||||
|
|
||||
|
tran 20n 2m |
||||
|
plot v(VGP4P8) |
||||
|
plot in out |
||||
|
|
||||
|
ac dec 10 1 1Meg |
||||
|
plot db(out) |
||||
|
.endc |
||||
|
|
||||
|
.end |
||||
@ -0,0 +1,13 @@ |
|||||
|
* subcircuit model file |
||||
|
|
||||
|
.include modelcard.nmos |
||||
|
.include modelcard.pmos |
||||
|
|
||||
|
.subckt NCH D G S B W=1 L=1 |
||||
|
MN1 D G S B N1 W={W} L={L} AS={3*L*W} AD={3*L*W} PS={6*L+W} AS={6*L+W} |
||||
|
.ends |
||||
|
|
||||
|
|
||||
|
.subckt PCH D G S B W=1 L=1 |
||||
|
MP1 D G S B P1 W={W} L={L} AS={3*L*W} AD={3*L*W} PS={6*L+W} AS={6*L+W} |
||||
|
.ends |
||||
@ -0,0 +1,46 @@ |
|||||
|
*model = bsim3v3 |
||||
|
*Berkeley Spice Compatibility |
||||
|
*http://bsim.berkeley.edu/BSIM4/BSIM3/ftpv330.zip |
||||
|
* Lmin= .35 Lmax= 20 Wmin= .6 Wmax= 20 |
||||
|
.model N1 NMOS |
||||
|
+Level= 8 |
||||
|
+version=3.3.0 |
||||
|
+Tnom=27.0 |
||||
|
+Acnqsmod=1 elm=3 |
||||
|
+Capmod=3 |
||||
|
+Nch= 2.498E+17 Tox=9E-09 Xj=1.00000E-07 |
||||
|
+Lint=9.36e-8 Wint=1.47e-7 |
||||
|
+Lintnoi=1e-9 |
||||
|
+Vth0= .6322 K1= .756 K2= -3.83e-2 K3= -2.612 |
||||
|
+Dvt0= 2.812 Dvt1= 0.462 Dvt2=-9.17e-2 |
||||
|
+Nlx= 3.52291E-08 W0= 1.163e-6 |
||||
|
+K3b= 2.233 |
||||
|
+Vsat= 86301.58 Ua= 6.47e-9 Ub= 4.23e-18 Uc=-4.706281E-11 |
||||
|
+Rdsw= 650 U0= 388.3203 wr=1 |
||||
|
+A0= .3496967 Ags=.1 B0=0.546 B1= 1 |
||||
|
+Dwg = -6.0E-09 Dwb = -3.56E-09 Prwb = -.213 |
||||
|
+Keta=-3.605872E-02 A1= 2.778747E-02 A2= .9 |
||||
|
+Voff=-6.735529E-02 NFactor= 1.139926 Cit= 1.622527E-04 |
||||
|
+Cdsc=-2.147181E-05 |
||||
|
+Cdscb= 0 Dvt0w = 0 Dvt1w = 0 Dvt2w = 0 |
||||
|
+Cdscd = 0 Prwg = 0 |
||||
|
+Eta0= 1.0281729E-02 Etab=-5.042203E-03 |
||||
|
+Dsub= .31871233 |
||||
|
+Pclm= 1.114846 Pdiblc1= 2.45357E-03 Pdiblc2= 6.406289E-03 |
||||
|
+Drout= .31871233 Pscbe1= 5000000 Pscbe2= 5E-09 Pdiblcb = -.234 |
||||
|
+Pvag= 0 delta=0.01 |
||||
|
+ Wl = 0 Ww = -1.420242E-09 Wwl = 0 |
||||
|
+ Wln = 0 Wwn = .2613948 Ll = 1.300902E-10 |
||||
|
+ Lw = 0 Lwl = 0 Lln = .316394 |
||||
|
+ Lwn = 0 |
||||
|
+kt1=-.3 kt2=-.051 |
||||
|
+At= 22400 |
||||
|
+Ute=-1.48 |
||||
|
+Ua1= 3.31E-10 Ub1= 2.61E-19 Uc1= -3.42e-10 |
||||
|
+Kt1l=0 Kt1=-0.1 Prt=764.3 |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
@ -0,0 +1,38 @@ |
|||||
|
*model = bsim3v3 |
||||
|
*Berkeley Spice Compatibility |
||||
|
*http://bsim.berkeley.edu/BSIM4/BSIM3/ftpv330.zip |
||||
|
* Lmin= .35 Lmax= 20 Wmin= .6 Wmax= 20 |
||||
|
.model P1 PMOS |
||||
|
+Level= 8 |
||||
|
+version=3.3.0 |
||||
|
+Tnom=27.0 |
||||
|
+Acnqsmod=1 elm=3 |
||||
|
+Nch= 3.533024E+17 Tox=9E-09 Xj=1.00000E-07 |
||||
|
+Lint=6.23e-8 Wint=1.22e-7 |
||||
|
+Lintnoi=1e-9 |
||||
|
+Vth0=-.6732829 K1= .8362093 K2=-8.606622E-02 K3= 1.82 |
||||
|
+Dvt0= 1.903801 Dvt1= .5333922 Dvt2=-.1862677 |
||||
|
+Nlx= 1.28e-8 W0= 2.1e-6 |
||||
|
+K3b= -0.24 Prwg=-0.001 Prwb=-0.323 |
||||
|
+Vsat= 103503.2 Ua= 1.39995E-09 Ub= 1.e-19 Uc=-2.73e-11 |
||||
|
+ Rdsw= 460 U0= 138.7609 |
||||
|
+A0= .4716551 Ags=0.12 |
||||
|
+Keta=-1.871516E-03 A1= .3417965 A2= 0.83 |
||||
|
+Voff=-.074182 NFactor= 1.54389 Cit=-1.015667E-03 |
||||
|
+Cdsc= 8.937517E-04 |
||||
|
+Cdscb= 1.45e-4 Cdscd=1.04e-4 |
||||
|
+ Dvt0w=0.232 Dvt1w=4.5e6 Dvt2w=-0.0023 |
||||
|
+Eta0= 6.024776E-02 Etab=-4.64593E-03 |
||||
|
+Dsub= .23222404 |
||||
|
+Pclm= .989 Pdiblc1= 2.07418E-02 Pdiblc2= 1.33813E-3 |
||||
|
+Drout= .3222404 Pscbe1= 118000 Pscbe2= 1E-09 |
||||
|
+Pvag= 0 |
||||
|
+kt1= -0.25 kt2= -0.032 prt=64.5 |
||||
|
+At= 33000 |
||||
|
+Ute= -1.5 |
||||
|
+Ua1= 4.312e-9 Ub1= 6.65e-19 Uc1= 0 |
||||
|
+Kt1l=0 |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
@ -0,0 +1,10 @@ |
|||||
|
* SEE generator model |
||||
|
.subckt seegen4 n1 n2 n3 n4 |
||||
|
.param tochar = 2e-13 |
||||
|
.param tfall = 500p trise=50p |
||||
|
.param Inull = 'tochar/(tfall-trise)' |
||||
|
* Eponential current source without control input |
||||
|
* only NMOS nodes with reference GND (substrate). |
||||
|
aseegen1 NULL [%i(n1) %i(n2) %i(n3) %i(n4)] seemod1 |
||||
|
.model seemod1 seegen (tdelay = 0.62m tperiod=0.1m inull='Inull' perlim=FALSE) |
||||
|
.ends |
||||
@ -0,0 +1,45 @@ |
|||||
|
* IHP Open PDK |
||||
|
* simple inverter |
||||
|
|
||||
|
* Path to the PDK |
||||
|
*.include "D:\Spice_general\skywater-pdk\libraries\sky130_fd_pr\latest\models\corners/tt.spice" |
||||
|
.lib "D:\Spice_general\IHP-Open-PDK\ihp-sg13g2\libs.tech\ngspice\models\cornerMOSlv.lib" mos_tt |
||||
|
*.include lib_out1.lib |
||||
|
|
||||
|
.param vdd = 1.2 |
||||
|
.param deltat=11n |
||||
|
|
||||
|
* the voltage sources: |
||||
|
Vdd vd gnd DC 'vdd' |
||||
|
V1 in gnd pulse(0 'vdd' 0p 200p 100p 5n 10n) |
||||
|
|
||||
|
* Eponential current source |
||||
|
Iset out 0 EXP(0 2.5m 'deltat' 10p 'deltat' 500p) |
||||
|
*Cset out 0 10f |
||||
|
|
||||
|
Xnot1 in vdd vss out not1 |
||||
|
Vmeasvss vss 0 0 |
||||
|
Vmeasvdd vd vdd 0 |
||||
|
|
||||
|
.subckt not1 a vdd vss z |
||||
|
xm01 z a vdd vdd sg13_lv_pmos l=0.15u w=0.99u as=0.26235p ad=0.26235p ps=2.51u pd=2.51u |
||||
|
xm02 z a vss vss sg13_lv_nmos l=0.15u w=0.495u as=0.131175p ad=0.131175p ps=1.52u pd=1.52u |
||||
|
c3 a vss 0.384f |
||||
|
c2 z vss 0.576f |
||||
|
.ends |
||||
|
|
||||
|
* simulation command: |
||||
|
.tran 100ps 50ns ; 0 10p |
||||
|
|
||||
|
.options method=gear |
||||
|
|
||||
|
.control |
||||
|
run |
||||
|
rusage |
||||
|
*set nolegend |
||||
|
set xbrushwidth=3 |
||||
|
plot i(Vmeasvss) i(Vmeasvdd) |
||||
|
plot in out |
||||
|
.endc |
||||
|
|
||||
|
.end |
||||
@ -0,0 +1,61 @@ |
|||||
|
* IHP Open PDK |
||||
|
* simple SRAM cell, exponential current pulses |
||||
|
|
||||
|
* Path to the PDK |
||||
|
*.include "D:\Spice_general\skywater-pdk\libraries\sky130_fd_pr\latest\models\corners/tt.spice" |
||||
|
.lib "D:\Spice_general\IHP-Open-PDK\ihp-sg13g2\libs.tech\ngspice\models\cornerMOSlv.lib" mos_tt |
||||
|
*.include lib_out1.lib |
||||
|
|
||||
|
.param vdd = 1.2 |
||||
|
.param deltat=11n deltat2=27n |
||||
|
.param tochar = 1e-13 |
||||
|
.param talpha = 500p tbeta=10p |
||||
|
.param Inull = 'tochar/(talpha-tbeta)' |
||||
|
|
||||
|
* the voltage sources: |
||||
|
Vdd vd gnd DC 'vdd' |
||||
|
Vwl wl 0 0 PULSE 0 'vdd' 45n 1n 1n 7n 1 |
||||
|
Vbl bl 0 'vdd' |
||||
|
Vbln bln 0 0 |
||||
|
|
||||
|
*V1 in gnd pulse(0 'vdd' 0p 200p 100p 5n 10n) |
||||
|
|
||||
|
* Eponential current source without control input |
||||
|
aseegen1 NULL [%id(n1 m1) %id(n2 m2) %id(n1 m1) %id(n2 m2)] seemod1 |
||||
|
.model seemod1 seegen (tdelay = 11n tperiod=25n inull='Inull') |
||||
|
|
||||
|
Xnot1 n1 vdd vss n2 not1 |
||||
|
Xnot2 n2 vdd vss n1 not1 |
||||
|
xmo02 n2 wl bl vss sg13_lv_nmos l=0.15u w=0.495u as=0.131175p ad=0.131175p ps=1.52u pd=1.52u |
||||
|
xmo01 n1 wl bln vss sg13_lv_nmos l=0.15u w=0.495u as=0.131175p ad=0.131175p ps=1.52u pd=1.52u |
||||
|
|
||||
|
Vmeasvss vss 0 0 |
||||
|
Vmeasvdd vd vdd 0 |
||||
|
Vm1 m1 0 0 |
||||
|
Vm2 m2 0 0 |
||||
|
|
||||
|
.subckt not1 a vdd vss z |
||||
|
xm01 z a vdd vdd sg13_lv_pmos l=0.15u w=0.99u as=0.26235p ad=0.26235p ps=2.51u pd=2.51u |
||||
|
xm02 z a vss vss sg13_lv_nmos l=0.15u w=0.495u as=0.131175p ad=0.131175p ps=1.52u pd=1.52u |
||||
|
c3 a vss 0.384f |
||||
|
c2 z vss 0.576f |
||||
|
.ends |
||||
|
|
||||
|
* starting condition for SRAM cell |
||||
|
.ic v(n2)=0 v(n1)='vdd' |
||||
|
|
||||
|
* simulation command: |
||||
|
.tran 100ps 100ns ; 0 10p |
||||
|
|
||||
|
.options method=gear |
||||
|
|
||||
|
.control |
||||
|
run |
||||
|
rusage |
||||
|
*set nolegend |
||||
|
set xbrushwidth=3 |
||||
|
plot i(Vmeasvss) i(Vmeasvdd) |
||||
|
plot n1 n2+2 wl+4 i(vm1)*10000+6 i(vm2)*10000+8 |
||||
|
.endc |
||||
|
|
||||
|
.end |
||||
@ -0,0 +1,60 @@ |
|||||
|
* Simple SRAM cell in a subcircuit, double exponential current pulses |
||||
|
* control volate |
||||
|
* IHP Open PDK |
||||
|
|
||||
|
* Path to the PDK |
||||
|
.lib "D:\Spice_general\IHP-Open-PDK\ihp-sg13g2\libs.tech\ngspice\models\cornerMOSlv.lib" mos_tt |
||||
|
|
||||
|
.param vdd = 1.2 |
||||
|
.param deltat=11n deltat2=25n |
||||
|
.param tochar = 1e-13 |
||||
|
.param talpha = 500p tbeta=20p |
||||
|
.param Inull = 'tochar/(talpha-tbeta)' |
||||
|
|
||||
|
* the voltage sources: |
||||
|
Vdd vd gnd DC 'vdd' |
||||
|
Vwl wl 0 0 PULSE 0 'vdd' 50n 1n 1n 7n 1 |
||||
|
Vbl bl 0 'vdd' |
||||
|
Vbln bln 0 0 |
||||
|
Vctrl ctrl 0 pulse (0 1 10n 1n 1n 1 1) |
||||
|
|
||||
|
* Exponential current source with control input |
||||
|
aseegen1 ctrl [%id(n1 m1) %id(n2 m2) %id(n1 m1) %id(n2 m2)] seemod1 |
||||
|
.model seemod1 seegen (tdelay = 8n tperiod=25n) |
||||
|
|
||||
|
Xnot1 n1 vdd vss n2 not1 |
||||
|
Xnot2 n2 vdd vss n1 not1 |
||||
|
xmo02 n2 wl bl vss sg13_lv_nmos l=0.15u w=0.495u as=0.131175p ad=0.131175p ps=1.52u pd=1.52u |
||||
|
xmo01 n1 wl bln vss sg13_lv_nmos l=0.15u w=0.495u as=0.131175p ad=0.131175p ps=1.52u pd=1.52u |
||||
|
|
||||
|
Vmeasvss vss 0 0 |
||||
|
Vmeasvdd vd vdd 0 |
||||
|
Vm1 m1 0 0 |
||||
|
Vm2 m2 0 0 |
||||
|
|
||||
|
.subckt not1 a vdd vss z |
||||
|
xm01 z a vdd vdd sg13_lv_pmos l=0.15u w=0.99u as=0.26235p ad=0.26235p ps=2.51u pd=2.51u |
||||
|
xm02 z a vss vss sg13_lv_nmos l=0.15u w=0.495u as=0.131175p ad=0.131175p ps=1.52u pd=1.52u |
||||
|
c3 a vss 0.384f |
||||
|
c2 z vss 0.576f |
||||
|
.ends |
||||
|
|
||||
|
* starting condition for SRAM cell |
||||
|
.ic v(n2)=0 v(n1)='vdd' |
||||
|
|
||||
|
* simulation command: |
||||
|
.tran 100ps 120ns |
||||
|
|
||||
|
.options method=gear |
||||
|
|
||||
|
.control |
||||
|
pre_osdi C:\Spice64\lib\ngspice\psp103_nqs.osdi |
||||
|
run |
||||
|
rusage |
||||
|
*set nolegend |
||||
|
set xbrushwidth=3 |
||||
|
plot i(Vmeasvss) i(Vmeasvdd) |
||||
|
plot n1 n2+2 wl+4 i(vm1)*10000+6 i(vm2)*10000+8 |
||||
|
.endc |
||||
|
|
||||
|
.end |
||||
@ -0,0 +1,69 @@ |
|||||
|
* Simple SRAM cell in a subcircuit, double exponential current pulses |
||||
|
* IHP Open PDK |
||||
|
|
||||
|
* Path to the PDK |
||||
|
.lib "D:\Spice_general\IHP-Open-PDK\ihp-sg13g2\libs.tech\ngspice\models\cornerMOSlv.lib" mos_tt |
||||
|
|
||||
|
.param vdd = 1.2 |
||||
|
.param deltat=11n deltat2=27n |
||||
|
*.param tochar = 1e-13 ; tochar dependency on LET not yet defined |
||||
|
.param tfall = 500p trise=20p ; tau in exponent for pulse |
||||
|
.param let = 11 |
||||
|
.param cdepth = 0.9 |
||||
|
*.param Inull = 'tochar/(tfall-trise)' |
||||
|
|
||||
|
* the voltage sources: |
||||
|
Vdd vd gnd DC 'vdd' |
||||
|
Vwl wl 0 0 PULSE 0 'vdd' 45n 1n 1n 7n 1 |
||||
|
Vbl1 bl1 0 'vdd' |
||||
|
Vbl2 bl2 0 0 |
||||
|
|
||||
|
**** SEE generator without control input, double exponential current sources |
||||
|
aseegen1 NULL [%id(xcell.n1 m1) %id(xcell.n2 m2) %id(xcell.n1 m1) %id(xcell.n2 m2)] seemod1 |
||||
|
.model seemod1 seegen (tdelay = 11n tperiod=25n let='let' cdepth='cdepth' tfall='tfall' trise='trise') |
||||
|
* alternative syntax, if no current measurement required and reference nodes are GND |
||||
|
*aseegen1 NULL [%i(xcell.n1) %i(xcell.n2) %i(xcell.n1) %i(xcell.n2)] seemod1 |
||||
|
|
||||
|
**** the SRAM cell |
||||
|
Xcell bl1 bl2 wl vdd vss srcell |
||||
|
|
||||
|
.subckt srcell bl1 bl2 wl vdd vss |
||||
|
Xnot1 n1 vdd vss n2 not1 |
||||
|
Xnot2 n2 vdd vss n1 not1 |
||||
|
xmo02 n2 wl bl1 vss sg13_lv_nmos l=0.15u w=0.495u as=0.131175p ad=0.131175p ps=1.52u pd=1.52u |
||||
|
xmo01 n1 wl bl2 vss sg13_lv_nmos l=0.15u w=0.495u as=0.131175p ad=0.131175p ps=1.52u pd=1.52u |
||||
|
.ends |
||||
|
|
||||
|
**** Current measurements |
||||
|
Vmeasvss vss 0 0 |
||||
|
Vmeasvdd vd vdd 0 |
||||
|
Vm1 m1 0 0 |
||||
|
Vm2 m2 0 0 |
||||
|
|
||||
|
**** Inverter cell |
||||
|
.subckt not1 a vdd vss z |
||||
|
xm01 z a vdd vdd sg13_lv_pmos l=0.15u w=0.99u as=0.26235p ad=0.26235p ps=2.51u pd=2.51u |
||||
|
xm02 z a vss vss sg13_lv_nmos l=0.15u w=0.495u as=0.131175p ad=0.131175p ps=1.52u pd=1.52u |
||||
|
c3 a vss 0.384f |
||||
|
c2 z vss 0.576f |
||||
|
.ends |
||||
|
|
||||
|
* starting condition for SRAM cell |
||||
|
.ic v(xcell.n2)=0 v(xcell.n1)='vdd' |
||||
|
|
||||
|
* simulation command: |
||||
|
.tran 100ps 120ns |
||||
|
|
||||
|
*.options method=gear |
||||
|
|
||||
|
.control |
||||
|
pre_osdi C:\Spice64\lib\ngspice\psp103_nqs.osdi |
||||
|
run |
||||
|
rusage |
||||
|
*set nolegend |
||||
|
set xbrushwidth=3 |
||||
|
plot i(Vmeasvss) i(Vmeasvdd) |
||||
|
plot xcell.n1 xcell.n2+2 wl+4 i(vm1)*10000+6 i(vm2)*10000+8 |
||||
|
.endc |
||||
|
|
||||
|
.end |
||||
@ -0,0 +1,81 @@ |
|||||
|
* Simple SRAM cell in a subcircuit, double exponential current pulses |
||||
|
* total charge is varied. |
||||
|
* IHP Open PDK |
||||
|
|
||||
|
* Path to the PDK |
||||
|
.lib "D:\Spice_general\IHP-Open-PDK\ihp-sg13g2\libs.tech\ngspice\models\cornerMOSlv.lib" mos_tt |
||||
|
|
||||
|
.param vdd = 1.2 |
||||
|
*.param tochar = 1e-13 ; tochar dependency on LET not yet defined |
||||
|
|
||||
|
.param d = 1 |
||||
|
.param let = 12 |
||||
|
|
||||
|
.param tochar = 1.035e-14 * let * d |
||||
|
.csparam let = 'let' ; send param value to .control section |
||||
|
.param tfall = 500p trise = 100p ; tau in exponent for pulse |
||||
|
.param Inull = 'tochar/(tfall-trise)' |
||||
|
|
||||
|
* the voltage sources: |
||||
|
Vdd vd gnd DC 'vdd' |
||||
|
Vwl wl 0 0 PULSE 0 'vdd' 45n 1n 1n 7n 1 |
||||
|
Vbl1 bl1 0 'vdd' |
||||
|
Vbl2 bl2 0 0 |
||||
|
|
||||
|
**** SEE generator without control input, double exponential current sources |
||||
|
aseegen1 NULL [%id(xcell.n1 m1) %id(xcell.n2 m2) %id(xcell.n1 m1) %id(xcell.n2 m2)] seemod1 |
||||
|
.model seemod1 seegen (tdelay = 11n tperiod=25n tfall='tfall' trise='trise' let='let' cdepth='d') |
||||
|
* alternative syntax, if no current measurement required and reference nodes are GND |
||||
|
*aseegen1 NULL [%i(xcell.n1) %i(xcell.n2) %i(xcell.n1) %i(xcell.n2)] seemod1 |
||||
|
|
||||
|
**** the SRAM cell |
||||
|
Xcell bl1 bl2 wl vdd vss srcell |
||||
|
|
||||
|
.subckt srcell bl1 bl2 wl vdd vss |
||||
|
Xnot1 n1 vdd vss n2 not1 |
||||
|
Xnot2 n2 vdd vss n1 not1 |
||||
|
xmo02 n2 wl bl1 vss sg13_lv_nmos l=0.15u w=0.495u as=0.131175p ad=0.131175p ps=1.52u pd=1.52u |
||||
|
xmo01 n1 wl bl2 vss sg13_lv_nmos l=0.15u w=0.495u as=0.131175p ad=0.131175p ps=1.52u pd=1.52u |
||||
|
.ends |
||||
|
|
||||
|
**** Current measurements |
||||
|
Vmeasvss vss 0 0 |
||||
|
Vmeasvdd vd vdd 0 |
||||
|
Vm1 m1 0 0 |
||||
|
Vm2 m2 0 0 |
||||
|
|
||||
|
**** Inverter cell |
||||
|
.subckt not1 a vdd vss z |
||||
|
xm01 z a vdd vdd sg13_lv_pmos l=0.15u w=0.99u as=0.26235p ad=0.26235p ps=2.51u pd=2.51u |
||||
|
xm02 z a vss vss sg13_lv_nmos l=0.15u w=0.495u as=0.131175p ad=0.131175p ps=1.52u pd=1.52u |
||||
|
c3 a vss 0.384f |
||||
|
c2 z vss 0.576f |
||||
|
.ends |
||||
|
|
||||
|
* starting condition for SRAM cell |
||||
|
.ic v(xcell.n2)=0 v(xcell.n1)='vdd' |
||||
|
|
||||
|
* simulation command: |
||||
|
.tran 100ps 120ns |
||||
|
|
||||
|
*.options method=gear |
||||
|
|
||||
|
.options noinit |
||||
|
|
||||
|
.control |
||||
|
pre_osdi C:\Spice64\lib\ngspice\psp103_nqs.osdi |
||||
|
set xbrushwidth=3 |
||||
|
let newlet = let |
||||
|
|
||||
|
repeat 5 |
||||
|
print newlet |
||||
|
run |
||||
|
plot xcell.n1 xcell.n2+2 wl+4 i(vm1)*10000+6 i(vm2)*10000+8 ylimit -1 10 |
||||
|
let newlet = newlet - 1 |
||||
|
alterparam let = $&newlet |
||||
|
reset |
||||
|
end |
||||
|
rusage |
||||
|
.endc |
||||
|
|
||||
|
.end |
||||
@ -0,0 +1,64 @@ |
|||||
|
* IHP Open PDK |
||||
|
* simple SRAM cell, exponential current pulses |
||||
|
|
||||
|
* Path to the PDK |
||||
|
*.include "D:\Spice_general\skywater-pdk\libraries\sky130_fd_pr\latest\models\corners/tt.spice" |
||||
|
.lib "D:\Spice_general\IHP-Open-PDK\ihp-sg13g2\libs.tech\ngspice\models\cornerMOSlv.lib" mos_tt |
||||
|
*.include lib_out1.lib |
||||
|
|
||||
|
.param vdd = 1.2 |
||||
|
.param deltat=11n deltat2=27n |
||||
|
.param tochar = 1e-13 |
||||
|
.param talpha = 500p tbeta=10p |
||||
|
.param Inull = 'tochar/(talpha-tbeta)' |
||||
|
|
||||
|
* the voltage sources: |
||||
|
Vdd vd gnd DC 'vdd' |
||||
|
Vwl wl 0 0 PULSE 0 'vdd' 45n 1n 1n 7n 1 |
||||
|
Vbl bl 0 'vdd' |
||||
|
Vbln bln 0 0 |
||||
|
|
||||
|
*V1 in gnd pulse(0 'vdd' 0p 200p 100p 5n 10n) |
||||
|
|
||||
|
* Eponential current source |
||||
|
Iset1 n1 m1 EXP(0 'Inull' 'deltat' 'tbeta' 'deltat' 'talpha') |
||||
|
Iset2 n2 m2 EXP(0 'Inull' 'deltat2' 'tbeta' 'deltat2' 'talpha') |
||||
|
Iset3 n1 m1 EXP(0 'Inull' 'deltat+50n' 'tbeta' 'deltat+50n' 'talpha') |
||||
|
Iset4 n2 m2 EXP(0 'Inull' 'deltat2+50n' 'tbeta' 'deltat2+50n' 'talpha') |
||||
|
*Cset out 0 10f |
||||
|
|
||||
|
Xnot1 n1 vdd vss n2 not1 |
||||
|
Xnot2 n2 vdd vss n1 not1 |
||||
|
xmo02 n2 wl bl vss sg13_lv_nmos l=0.15u w=0.495u as=0.131175p ad=0.131175p ps=1.52u pd=1.52u |
||||
|
xmo01 n1 wl bln vss sg13_lv_nmos l=0.15u w=0.495u as=0.131175p ad=0.131175p ps=1.52u pd=1.52u |
||||
|
|
||||
|
Vmeasvss vss 0 0 |
||||
|
Vmeasvdd vd vdd 0 |
||||
|
Vm1 m1 0 0 |
||||
|
Vm2 m2 0 0 |
||||
|
|
||||
|
.subckt not1 a vdd vss z |
||||
|
xm01 z a vdd vdd sg13_lv_pmos l=0.15u w=0.99u as=0.26235p ad=0.26235p ps=2.51u pd=2.51u |
||||
|
xm02 z a vss vss sg13_lv_nmos l=0.15u w=0.495u as=0.131175p ad=0.131175p ps=1.52u pd=1.52u |
||||
|
c3 a vss 0.384f |
||||
|
c2 z vss 0.576f |
||||
|
.ends |
||||
|
|
||||
|
* starting condition for SRAM cell |
||||
|
.ic v(n2)=0 v(n1)='vdd' |
||||
|
|
||||
|
* simulation command: |
||||
|
.tran 100ps 100ns ; 0 10p |
||||
|
|
||||
|
.options method=gear |
||||
|
|
||||
|
.control |
||||
|
run |
||||
|
rusage |
||||
|
*set nolegend |
||||
|
set xbrushwidth=3 |
||||
|
plot i(Vmeasvss) i(Vmeasvdd) |
||||
|
plot n1 n2+2 wl+4 i(vm1)*10000+6 i(vm2)*10000+8 |
||||
|
.endc |
||||
|
|
||||
|
.end |
||||
@ -0,0 +1,48 @@ |
|||||
|
* IHP Open PDK |
||||
|
* simple inverter |
||||
|
|
||||
|
* Path to the PDK |
||||
|
*.include "D:\Spice_general\skywater-pdk\libraries\sky130_fd_pr\latest\models\corners/tt.spice" |
||||
|
.lib "D:\Spice_general\IHP-Open-PDK\ihp-sg13g2\libs.tech\ngspice\models\cornerMOSlv.lib" mos_tt |
||||
|
*.include lib_out1.lib |
||||
|
|
||||
|
.param vdd = 1.2 |
||||
|
.param deltat=11n deltat2=27n |
||||
|
|
||||
|
* the voltage sources: |
||||
|
Vdd vd gnd DC 'vdd' |
||||
|
V1 in gnd pulse(0 'vdd' 0p 200p 100p 5n 10n) |
||||
|
|
||||
|
* Eponential current source |
||||
|
Iset1 out1 0 EXP(0 250u 'deltat' 10p 'deltat' 500p) |
||||
|
Iset2 out1 0 EXP(0 250u 'deltat2' 10p 'deltat2' 500p) |
||||
|
*Cset out 0 10f |
||||
|
|
||||
|
Xnot1 in vdd vss out1 not1 |
||||
|
Xnot2 out1 vdd vss out not1 |
||||
|
|
||||
|
Vmeasvss vss 0 0 |
||||
|
Vmeasvdd vd vdd 0 |
||||
|
|
||||
|
.subckt not1 a vdd vss z |
||||
|
xm01 z a vdd vdd sg13_lv_pmos l=0.15u w=0.99u as=0.26235p ad=0.26235p ps=2.51u pd=2.51u |
||||
|
xm02 z a vss vss sg13_lv_nmos l=0.15u w=0.495u as=0.131175p ad=0.131175p ps=1.52u pd=1.52u |
||||
|
c3 a vss 0.384f |
||||
|
c2 z vss 0.576f |
||||
|
.ends |
||||
|
|
||||
|
* simulation command: |
||||
|
.tran 100ps 50ns ; 0 10p |
||||
|
|
||||
|
.options method=gear |
||||
|
|
||||
|
.control |
||||
|
run |
||||
|
rusage |
||||
|
*set nolegend |
||||
|
set xbrushwidth=3 |
||||
|
plot i(Vmeasvss) i(Vmeasvdd) |
||||
|
plot in out1+2 out+4 |
||||
|
.endc |
||||
|
|
||||
|
.end |
||||
@ -0,0 +1,41 @@ |
|||||
|
* Repeat loop, double exponential current pulses |
||||
|
|
||||
|
.param let = 10.5 cdepth = 1.2 |
||||
|
.csparam let = 'let' |
||||
|
.param tfall = 500p trise = 20p ; tau in exponent for pulse |
||||
|
|
||||
|
R1 n1 0 1e4 |
||||
|
R2 n2 0 1e4 |
||||
|
R3 n3 0 1e4 |
||||
|
R4 n4 0 1e4 |
||||
|
|
||||
|
|
||||
|
**** SEE generator without control input, double exponential current sources |
||||
|
aseegen1 NULL [%id(n1 0) %id(n2 0) %id(n3 0) %id(n4 0)] seemod1 |
||||
|
.model seemod1 seegen (tdelay = 11n tperiod=25n let='let' cdepth='cdepth' trise='trise' tfall='tfall') |
||||
|
* alternative syntax, if no current measurement required and reference nodes are GND |
||||
|
*aseegen1 NULL [%i(n1) %i(n2) %i(n3) %i(n4)] seemod1 |
||||
|
|
||||
|
|
||||
|
|
||||
|
* simulation command: |
||||
|
.tran 100ps 120ns |
||||
|
|
||||
|
*.options method=gear |
||||
|
|
||||
|
.control |
||||
|
set xbrushwidth=3 |
||||
|
*run |
||||
|
*plot n1 n2+2 n3+4 n4+6 |
||||
|
let newlet = let |
||||
|
repeat 10 |
||||
|
run |
||||
|
plot n1 n2+2 n3+4 n4+6 ylimit -3 7 |
||||
|
let newlet = newlet - 0.5 |
||||
|
alterparam let = $&newlet |
||||
|
reset |
||||
|
end |
||||
|
rusage |
||||
|
.endc |
||||
|
|
||||
|
.end |
||||
@ -0,0 +1,22 @@ |
|||||
|
Test of seegen code model |
||||
|
|
||||
|
aseegen1 NULL [%id(n1 p1) %id(n2 p2) %id(n3 p3)] seemod1 |
||||
|
.model seemod1 seegen (tdelay = 5n tperiod=4.5n) |
||||
|
|
||||
|
Rsee1 n1 0 1 |
||||
|
Vmeas1 p1 0 0 |
||||
|
|
||||
|
Rsee2 n2 0 1 |
||||
|
Vmeas2 p2 0 0 |
||||
|
|
||||
|
Rsee3 n3 0 1 |
||||
|
Vmeas3 p3 0 0 |
||||
|
|
||||
|
.control |
||||
|
tran 10p 35n |
||||
|
rusage time |
||||
|
set xbrushwidth=3 |
||||
|
plot i(Vmeas1) i(Vmeas2)+200u i(Vmeas3)+400u |
||||
|
.endc |
||||
|
|
||||
|
.end |
||||
@ -0,0 +1,23 @@ |
|||||
|
SET pulse test |
||||
|
|
||||
|
.param alpha = 100p beta = 500p deltat = 1n |
||||
|
|
||||
|
* Arbitrary currnt source with expression |
||||
|
Bset1 1 0 I = ternary_fcn(TIME < 'deltat', 0, 2.5m * (exp(-(TIME-'deltat')/'alpha')-exp(-(TIME-'deltat')/'beta'))) |
||||
|
R1 1 11 1 |
||||
|
Vmeas 11 0 0 |
||||
|
|
||||
|
* Eponential current source |
||||
|
Iset 2 0 EXP(0 -2.5m 'deltat' 'alpha' 'deltat' 'beta') |
||||
|
R2 2 22 1 |
||||
|
Vmeas2 22 0 0 |
||||
|
|
||||
|
|
||||
|
.control |
||||
|
tran 1p 10n |
||||
|
set xbrushwidth=2 |
||||
|
plot I(Vmeas)-I(Vmeas2) |
||||
|
plot I(Vmeas) I(Vmeas2) |
||||
|
.endc |
||||
|
|
||||
|
.end |
||||
@ -0,0 +1,231 @@ |
|||||
|
/*.......1.........2.........3.........4.........5.........6.........7.........8 |
||||
|
================================================================================ |
||||
|
|
||||
|
FILE seegenerator/cfunc.mod |
||||
|
|
||||
|
Public Domain |
||||
|
|
||||
|
Universty Duisburg-Essen |
||||
|
Duisburg, Germany |
||||
|
Project Flowspace |
||||
|
|
||||
|
AUTHORS |
||||
|
|
||||
|
19 May 2025 Holger Vogt |
||||
|
|
||||
|
|
||||
|
MODIFICATIONS |
||||
|
|
||||
|
|
||||
|
|
||||
|
SUMMARY |
||||
|
|
||||
|
This file contains the model-specific routines used to |
||||
|
functionally describe the see (single event effects) generator code model. |
||||
|
|
||||
|
|
||||
|
INTERFACES |
||||
|
|
||||
|
FILE ROUTINE CALLED |
||||
|
|
||||
|
|
||||
|
REFERENCED FILES |
||||
|
|
||||
|
Inputs from and outputs to ARGS structure. |
||||
|
|
||||
|
|
||||
|
NON-STANDARD FEATURES |
||||
|
|
||||
|
NONE |
||||
|
|
||||
|
===============================================================================*/ |
||||
|
|
||||
|
/*=== INCLUDE FILES ====================*/ |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
/*=== CONSTANTS ========================*/ |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
/*=== MACROS ===========================*/ |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
/*=== LOCAL VARIABLES & TYPEDEFS =======*/ |
||||
|
|
||||
|
static void |
||||
|
cm_seegen_callback(ARGS, Mif_Callback_Reason_t reason) |
||||
|
{ |
||||
|
switch (reason) { |
||||
|
case MIF_CB_DESTROY: { |
||||
|
double *last_t_value = STATIC_VAR (last_t_value); |
||||
|
if (last_t_value) |
||||
|
free(last_t_value); |
||||
|
STATIC_VAR (last_t_value) = NULL; |
||||
|
int *pulse_number = STATIC_VAR (pulse_number); |
||||
|
if (pulse_number) |
||||
|
free(pulse_number); |
||||
|
STATIC_VAR (pulse_number) = NULL; |
||||
|
break; |
||||
|
double *last_ctrl = STATIC_VAR (last_ctrl); |
||||
|
if (last_ctrl) |
||||
|
free(last_ctrl); |
||||
|
STATIC_VAR (last_ctrl) = NULL; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
/*============================================================================== |
||||
|
|
||||
|
FUNCTION void cm_seegen() |
||||
|
|
||||
|
AUTHORS |
||||
|
|
||||
|
19 May 2025 Holger Vogt |
||||
|
|
||||
|
SUMMARY |
||||
|
|
||||
|
This function implements the see generator code model. |
||||
|
|
||||
|
INTERFACES |
||||
|
|
||||
|
FILE ROUTINE CALLED |
||||
|
|
||||
|
CMutil.c void cm_smooth_corner(); |
||||
|
void cm_smooth_discontinuity(); |
||||
|
void cm_climit_fcn() |
||||
|
|
||||
|
RETURNED VALUE |
||||
|
|
||||
|
Returns inputs and outputs via ARGS structure. |
||||
|
|
||||
|
GLOBAL VARIABLES |
||||
|
|
||||
|
NONE |
||||
|
|
||||
|
NON-STANDARD FEATURES |
||||
|
|
||||
|
model source: |
||||
|
Ygor Quadros de Aguiar, Frédéric Wrobel. Jean-Luc Autran, Rubén García Alía |
||||
|
Single-Event Effects, from Space to Accelerator Environments |
||||
|
Springer 2025 |
||||
|
|
||||
|
==============================================================================*/ |
||||
|
|
||||
|
/*=== CM_SEEGEN ROUTINE ===*/ |
||||
|
|
||||
|
void cm_seegen(ARGS) /* structure holding parms, |
||||
|
inputs, outputs, etc. */ |
||||
|
{ |
||||
|
double tfall; /* pulse fall time */ |
||||
|
double trise; /* pulse rise time */ |
||||
|
double tdelay; /* delay until first pulse */ |
||||
|
double inull; /* max. current of pulse */ |
||||
|
double let; /* linear energy transfer */ |
||||
|
double cdepth; /* charge collection depth */ |
||||
|
double angle; /* particle entrance angle */ |
||||
|
double tperiod; /* pulse repetition period */ |
||||
|
double ctrlthres; /* control voltage threshold */ |
||||
|
double ctrl; /* control input */ |
||||
|
double out; /* output current */ |
||||
|
double *last_t_value; /* static storage of next pulse time */ |
||||
|
int *pulse_number; /* static storage of next pulse time */ |
||||
|
double *last_ctrl; /* static storage of last ctrl value */ |
||||
|
double tcurr = TIME; /* current simulation time */ |
||||
|
|
||||
|
if (ANALYSIS == MIF_AC) { |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
/* Retrieve frequently used parameters... */ |
||||
|
|
||||
|
tfall = PARAM(tfall); |
||||
|
trise = PARAM(trise); |
||||
|
tdelay = PARAM(tdelay); |
||||
|
tperiod = PARAM(tperiod); |
||||
|
inull = PARAM(inull); |
||||
|
let = PARAM(let); |
||||
|
cdepth = PARAM(cdepth); |
||||
|
angle = PARAM(angle); |
||||
|
ctrlthres = PARAM(ctrlthres); |
||||
|
|
||||
|
if (PORT_NULL(ctrl)) |
||||
|
ctrl = 1; |
||||
|
else |
||||
|
ctrl = INPUT(ctrl); |
||||
|
|
||||
|
if (INIT==1) { |
||||
|
/* Allocate storage for last_t_value */ |
||||
|
STATIC_VAR(last_t_value) = (double *) malloc(sizeof(double)); |
||||
|
last_t_value = (double *) STATIC_VAR(last_t_value); |
||||
|
*last_t_value = tdelay; |
||||
|
STATIC_VAR(pulse_number) = (int *) malloc(sizeof(int)); |
||||
|
pulse_number = (int *) STATIC_VAR(pulse_number); |
||||
|
*pulse_number = 1; |
||||
|
STATIC_VAR(last_ctrl) = (double *) malloc(sizeof(double)); |
||||
|
last_ctrl = (double *) STATIC_VAR(last_ctrl); |
||||
|
*last_ctrl = ctrl; |
||||
|
/* set breakpoints at first pulse start and pulse maximum times */ |
||||
|
double tatmax = *last_t_value + tfall * trise * log(trise/tfall) / (trise - tfall); |
||||
|
cm_analog_set_perm_bkpt(*last_t_value); |
||||
|
cm_analog_set_perm_bkpt(tatmax); |
||||
|
} |
||||
|
else { |
||||
|
|
||||
|
last_t_value = (double *) STATIC_VAR(last_t_value); |
||||
|
pulse_number = (int *) STATIC_VAR(pulse_number); |
||||
|
last_ctrl = (double *) STATIC_VAR(last_ctrl); |
||||
|
|
||||
|
if (*last_ctrl < ctrlthres && ctrl >= ctrlthres) { |
||||
|
*last_t_value = *last_t_value + tcurr; |
||||
|
*last_ctrl = ctrl; |
||||
|
} |
||||
|
|
||||
|
/* the double exponential current pulse function */ |
||||
|
if (tcurr < *last_t_value) |
||||
|
out = 0; |
||||
|
else { |
||||
|
if (inull == 0) { |
||||
|
double LETeff = let/cos(angle); |
||||
|
double Qc = 1.035e-14 * LETeff * cdepth; |
||||
|
inull = Qc / (tfall - trise); |
||||
|
} |
||||
|
out = inull * (exp(-(tcurr-*last_t_value)/tfall) - exp(-(tcurr-*last_t_value)/trise)); |
||||
|
} |
||||
|
if (tcurr > *last_t_value + tperiod * 0.9) { |
||||
|
/* return some info */ |
||||
|
cm_message_printf("port name: out, node pair no.: %d, \nnode names: %s, %s, pulse time: %e", |
||||
|
*pulse_number, cm_get_node_name("out", *pulse_number - 1), |
||||
|
cm_get_neg_node_name("out", *pulse_number - 1), *last_t_value); |
||||
|
/* set the time for the next pulse */ |
||||
|
*last_t_value = *last_t_value + tperiod; |
||||
|
/* set breakpoints at new pulse start and pulse maximum times */ |
||||
|
double tatmax = *last_t_value + tfall * trise * log(trise/tfall) / (trise - tfall); |
||||
|
cm_analog_set_perm_bkpt(*last_t_value); |
||||
|
cm_analog_set_perm_bkpt(tatmax); |
||||
|
(*pulse_number)++; |
||||
|
if (*pulse_number > PORT_SIZE(out)) { |
||||
|
if (PARAM(perlim) == FALSE) |
||||
|
*pulse_number = 1; |
||||
|
else |
||||
|
*last_t_value = 1e12; /* stop any output */ |
||||
|
} |
||||
|
} |
||||
|
if (*pulse_number - 1 < PORT_SIZE(out)) |
||||
|
OUTPUT(out[*pulse_number - 1]) = out; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
@ -0,0 +1,120 @@ |
|||||
|
/*.......1.........2.........3.........4.........5.........6.........7.........8 |
||||
|
================================================================================ |
||||
|
Public Domain |
||||
|
|
||||
|
|
||||
|
Universty Duisburg-Essen |
||||
|
Duisburg, Germany |
||||
|
Project Flowspace |
||||
|
|
||||
|
AUTHORS |
||||
|
|
||||
|
Holger Vogt 19 May 2025 |
||||
|
|
||||
|
|
||||
|
|
||||
|
SUMMARY |
||||
|
|
||||
|
This file contains the interface specification file for the |
||||
|
analog seegen code model. |
||||
|
|
||||
|
===============================================================================*/ |
||||
|
|
||||
|
NAME_TABLE: |
||||
|
|
||||
|
C_Function_Name: cm_seegen |
||||
|
Spice_Model_Name: seegen |
||||
|
Description: "single event effect generator" |
||||
|
|
||||
|
|
||||
|
PORT_TABLE: |
||||
|
|
||||
|
Port_Name: ctrl out |
||||
|
Description: "control input" "output" |
||||
|
Direction: in out |
||||
|
Default_Type: v i |
||||
|
Allowed_Types: [v,vd,i,id] [i,id] |
||||
|
Vector: no yes |
||||
|
Vector_Bounds: - [1 -] |
||||
|
Null_Allowed: yes no |
||||
|
|
||||
|
|
||||
|
PARAMETER_TABLE: |
||||
|
|
||||
|
Parameter_Name: tfall trise |
||||
|
Description: "pulse fall time" "pulse rise time" |
||||
|
Data_Type: real real |
||||
|
Default_Value: 500e-12 20e-12 |
||||
|
Limits: - - |
||||
|
Vector: no no |
||||
|
Vector_Bounds: - - |
||||
|
Null_Allowed: yes yes |
||||
|
|
||||
|
|
||||
|
PARAMETER_TABLE: |
||||
|
|
||||
|
Parameter_Name: tdelay inull |
||||
|
Description: "pulse delay" "max current" |
||||
|
Data_Type: real real |
||||
|
Default_Value: 0 0 |
||||
|
Limits: - - |
||||
|
Vector: no no |
||||
|
Vector_Bounds: - - |
||||
|
Null_Allowed: yes yes |
||||
|
|
||||
|
|
||||
|
PARAMETER_TABLE: |
||||
|
|
||||
|
Parameter_Name: tperiod ctrlthres |
||||
|
Description: "pulse repetition" "control voltage threshold" |
||||
|
Data_Type: real real |
||||
|
Default_Value: 0 0.5 |
||||
|
Limits: - - |
||||
|
Vector: no no |
||||
|
Vector_Bounds: - - |
||||
|
Null_Allowed: yes yes |
||||
|
|
||||
|
|
||||
|
PARAMETER_TABLE: |
||||
|
|
||||
|
Parameter_Name: let cdepth |
||||
|
Description: "lin energy transfer" "charge collection depth" |
||||
|
Data_Type: real real |
||||
|
Default_Value: 10 1 |
||||
|
Limits: - - |
||||
|
Vector: no no |
||||
|
Vector_Bounds: - - |
||||
|
Null_Allowed: yes yes |
||||
|
|
||||
|
|
||||
|
PARAMETER_TABLE: |
||||
|
|
||||
|
Parameter_Name: angle perlim |
||||
|
Description: "particle angle" "pulse repetition" |
||||
|
Data_Type: real boolean |
||||
|
Default_Value: 0 TRUE |
||||
|
Limits: [0 1.57079] - |
||||
|
Vector: no no |
||||
|
Vector_Bounds: - - |
||||
|
Null_Allowed: yes yes |
||||
|
|
||||
|
STATIC_VAR_TABLE: |
||||
|
|
||||
|
Static_Var_Name: last_t_value |
||||
|
Data_Type: pointer |
||||
|
Vector: no |
||||
|
Description: "next pulse start time" |
||||
|
|
||||
|
STATIC_VAR_TABLE: |
||||
|
|
||||
|
Static_Var_Name: pulse_number |
||||
|
Data_Type: pointer |
||||
|
Vector: no |
||||
|
Description: "number of pulse" |
||||
|
|
||||
|
STATIC_VAR_TABLE: |
||||
|
|
||||
|
Static_Var_Name: last_ctrl |
||||
|
Data_Type: pointer |
||||
|
Vector: no |
||||
|
Description: "last control value" |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue