From 69cac5bcc62b3dd5dc734c90f7702ff8c83e140c Mon Sep 17 00:00:00 2001 From: Holger Vogt Date: Tue, 3 Jun 2025 10:51:51 +0200 Subject: [PATCH] README and examples updated (trise, tfall, let, cdepth). --- README.SEEgenerator | 295 +++++++++++------- examples/xspice/see/CMOSOpAmp/seegen4.mod | 7 +- examples/xspice/see/seegenator.txt | 102 ------ src/xspice/icm/xtradev/seegenerator/cfunc.mod | 4 +- 4 files changed, 180 insertions(+), 228 deletions(-) delete mode 100644 examples/xspice/see/seegenator.txt diff --git a/README.SEEgenerator b/README.SEEgenerator index 12741ce43..b1c42f114 100644 --- a/README.SEEgenerator +++ b/README.SEEgenerator @@ -1,121 +1,174 @@ -SEE (single event effects) generator - - - -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: talpha tbeta -Description: "alpha" "beta" -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 200e-6 -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: perlim -Description: "pulse repetition limited" -Data_Type: boolean -Default_Value: TRUE -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: 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)/talpha) - (exp(-(t-tdelay)/tbeta) for t > tdelay -i(t) = 0 for t < tdelay -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. -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. The time step TSEP should be chosen to be not -larger than than tbeta. - -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, 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=200u talpha=500p tbeta=20p perlim=FALSE) +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. The time step TSTEP should be chosen to be not +larger than than trise. + +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) diff --git a/examples/xspice/see/CMOSOpAmp/seegen4.mod b/examples/xspice/see/CMOSOpAmp/seegen4.mod index e2d4d0b07..c29d787fe 100644 --- a/examples/xspice/see/CMOSOpAmp/seegen4.mod +++ b/examples/xspice/see/CMOSOpAmp/seegen4.mod @@ -1,9 +1,10 @@ * SEE generator model .subckt seegen4 n1 n2 n3 n4 -.param tochar = 1e-13 -.param talpha = 500p tbeta=20p -.param Inull = 'tochar/(talpha-tbeta)' +.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 \ No newline at end of file diff --git a/examples/xspice/see/seegenator.txt b/examples/xspice/see/seegenator.txt deleted file mode 100644 index 3814d185e..000000000 --- a/examples/xspice/see/seegenator.txt +++ /dev/null @@ -1,102 +0,0 @@ -SEE (single event effects) generator - - - -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: talpha tbeta -Description: "alpha" "beta" -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 200e-6 -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 - -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)/talpha) - (exp(-(t-tdelay)/tbeta) for t > tdelay -i(t) = 0 for t < tdelay -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. 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. 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, 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=200u talpha=500p tbeta=20p) diff --git a/src/xspice/icm/xtradev/seegenerator/cfunc.mod b/src/xspice/icm/xtradev/seegenerator/cfunc.mod index 91bffaebc..dfcd3b758 100644 --- a/src/xspice/icm/xtradev/seegenerator/cfunc.mod +++ b/src/xspice/icm/xtradev/seegenerator/cfunc.mod @@ -117,8 +117,8 @@ GLOBAL VARIABLES 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 + 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 ==============================================================================*/