****************************************************************************
*
* WARNING : please consider following remarks before usage
*
* 1) All models are a tradeoff between accuracy and complexity (ie. simulation
*    time).
* 2) Macromodels are not a substitute to breadboarding, they rather confirm the
*    validity of a design approach and help to select surrounding component values.
* 3) A macromodel emulates the NOMINAL performance of a TYPICAL device within
*    SPECIFIED OPERATING CONDITIONS (ie. temperature, supply voltage, etc.).
*    Thus the macromodel is often not as exhaustive as the datasheet, its goal
*    is to illustrate the main parameters of the product.
* 4) Data issued from macromodels used outside of its specified conditions
*    (Vcc, Temperature, etc) or even worse: outside of the device operating
*    conditions (Vcc, Vicm, etc) are not reliable in any way.
*
****************************************************************************
****
***  TS3021/TS3022  Spice macromodel subckt
***
***  Version 3.0 (November 2011)
****                      
************ CONNECTIONS: 
****             NON-INVERTING INPUT
****              |  INVERTING INPUT
****              |   |   POSITIVE POWER SUPPLY
****              |   |    |   NEGATIVE POWER SUPPLY
****              |   |    |    |  OUTPUT  
****              |   |    |    |   |     
****              |   |    |    |   |  
.SUBCKT TS302x   VP  VM  VCCP VCCN  VS
    C84 VM VP 5p
    M_NMOS2 VO_DIFF_PLUS VM VEE_N VCCN_ENHANCED MOS_N L={L} W={W}
    M_NMOS1 VO_DIFF_MINUS NET221 VEE_N VCCN_ENHANCED MOS_N L={L} W={W}
    IIN_BIAS_VM VREF VM DC 80n
    IEE_N VEE_N VCCN_ENHANCED DC {IEE}
    IIN_BIAS_VP VREF VP DC 80n
    V58 NET279 NET214 DC {Vd_compensazione}
    V59 NET240 NET287 DC {Vd_compensazione}
    VREADIO VB_4 VS DC 0
    VVLIM_LOW_VB NET295 NET220 DC {Vd_compensazione}
    VI0 NET221 VP DC 0
    VPROT_IN_P_VCCP NET223 NET256 DC {V_DPROT}
    V_ENHANCE_VCCN VCCN_ENHANCED VCCN DC {VCCN_enhance}
    VVLIM_HIGH_VB NET244 NET291 DC {Vd_compensazione}
    V_ENHANCE_VCCP VCCP_ENHANCED VCCP DC {VCCP_enhance}
    VPROT_IN_M_VCCN NET231 NET355 DC {V_DPROT}
    VPROT_IN_P_VCCN NET233 NET234 DC {V_DPROT}
    VPROT_IN_M_VCCP NET343 NET246 DC {V_DPROT}
    D40 NET214 VB_D_VOD DIODE_NOVd
    DILIM_SINK VB_3_SINK VB_3 DIODE_ILIM
    D41 VB_D_VOD NET240 DIODE_NOVd
    D_ENABLE_FALL V_C_FALL VB_D_G_RF DIODE_rf
    DILIM_SOURCE VB_3 VB_3_SOURCE DIODE_ILIM
    D3 VB_D_G NET244 DIODE_NOVd
    DPROT_IN_M_VCCP VM NET246 DIODE_VLIM
    D_ENABLE_RISE VB_D_G_RF V_C_RISE DIODE_rf
    D4 NET220 VB_D_G DIODE_NOVd
    DPROT_IN_M_VCCN NET231 VM DIODE_VLIM
    DPROT_IN_P_VCCP NET221 NET256 DIODE_VLIM
    DPROT_IN_P_VCCN NET233 NET221 DIODE_VLIM
    E_VDEP_SOURCE_2 VAL_VDEP_SOURCE_FILTERED 0
+VALUE={IF(V(val_vdep_source)>=0, 0, V(val_vdep_source))}

******************************
*  VCCAP C_FALL
******************************
*Eldo:
*   E_C_FALL V_VALORI_C_FALL 0 PWL(1) VCCP VCCN ( 2 , {28p/CAP_scale} ) 
*   + ( 3.3 , {1p/CAP_scale} ) ( 5 , {1p/CAP_scale} )
*   X_C_FALL V_VALORI_C_FALL 0   VREF V_C_FALL   VCCAP_PSPICE  
*   +CAP_scale={CAP_scale}  Rserie=1
*PSpice:   
   E_C_FALL V_VALORI_C_FALL 0  VALUE={ TABLE( V(VCCP,VCCN) , 2 , 28p , 
   + 3.3 , 1p , 5 , 1p )/CAP_scale }   
   X_C_FALL V_VALORI_C_FALL 0    VREF V_C_FALL   VCCAP_PSPICE 
   +PARAMS: CAP_scale={CAP_scale}  Rserie=1


******************************
*  VCCAP C_RISE
******************************  
*Eldo:  
*   E_C_RISE V_VALORI_C_RISE 0 PWL(1) VCCP VCCN ( 2 , {46p/CAP_scale})
*   + ( 3.3 , {42p/CAP_scale} ) ( 5 , {1p/CAP_scale} )
*   X_C_RISE V_VALORI_C_RISE 0 V_C_RISE VREF VCCAP_PSPICE  
*   +CAP_scale={CAP_scale}  Rserie=1
*PSpice:
   E_C_RISE V_VALORI_C_RISE 0 VALUE={ TABLE( V(VCCP,VCCN) , 2 , 46p ,
   + 3.3 , 42p , 5 , 1p )/CAP_scale }
   X_C_RISE V_VALORI_C_RISE 0 V_C_RISE VREF VCCAP_PSPICE 
   +PARAMS:  CAP_scale={CAP_scale}  Rserie=1 

   
    E65 NET279 0 VCCN 0 1.0
    E_VDEP_SOURCE_1 VAL_VDEP_SOURCE 0 VALUE={( -92.08371040724474 +
+72.77526395173992*V(Vccp,Vccn) +
+1.5082956259414868*V(Vccp,Vccn)*V(Vccp,Vccn) )  -5000*I(VreadIo) }
    E_VDEP_SINK_3 VDEP_SINK 0 VALUE={IF( abs(I(VreadIo))<1m , 0 ,
+V(val_vdep_sink_filtered))}
    E_VDEP_SINK_2 VAL_VDEP_SINK_FILTERED 0
+VALUE={IF(V(val_vdep_sink)<=0 , 0 , V(val_vdep_sink))}


******************************
*  Icc
******************************
* Eldo:
*    E_ICCSAT_HIGH ICC_OUT_HIGH 0 PWL(1) VCCP VCCN ( 2 , {64e-6 - IEE} ) (
*    +3.3 , {65e-6 - IEE} ) ( 5 , {67e-6 -IEE} )
* PSpice:    
    E_ICCSAT_HIGH ICC_OUT_HIGH 0 VALUE={TABLE( V(VCCP,VCCN) , 2 , {64e-6 - IEE} , 
   + 3.3 , {65e-6 - IEE} , 5 , {67e-6 -IEE} )}    
* Eldo:
*    E_ICCSAT_LOW ICC_OUT_LOW 0 PWL(1) VCCP VCCN ( 2 , {75e-6 - IEE} ) (
*    +3.3 , {77e-6 - IEE} ) ( 5 , {80e-6 - IEE} )
* PSpice:    
    E_ICCSAT_LOW ICC_OUT_LOW 0 VALUE={TABLE( V(VCCP,VCCN) , 2 , {75e-6 - IEE} , 
   + 3.3 , {77e-6 - IEE} , 5 , {80e-6 -IEE} )} 

    E66 NET287 0 VCCP 0 1.0
    EVLIM_HIGH_VB NET291 0 VCCP 0 1.0
    EILIM_SOURCE VB_3_SOURCE VDEP_SOURCE VB_3 0 1.0
    EVLIM_LOW_VB NET295 0 VCCN 0 1.0

******************************
*  VCCAP C_VOD
******************************
*Eldo:
*    E_C_VOD V_VALORI_C_VOD 0 PWL(1) VP VM ( -140m , {3.4p/CAP_scale} ) (
*  +-120m , {2.88p/CAP_scale} ) ( -110m , {2.45p/CAP_scale} ) ( -100m ,
*  +{2.1p/CAP_scale} ) ( -90m , {1.76p/CAP_scale} ) ( -80m ,
*  +{1.48p/CAP_scale} ) ( -70m , {1.27p/CAP_scale} ) ( -60m ,
*  +{1.095p/CAP_scale} ) ( -40m , {0.84p/CAP_scale} ) ( -20m ,
*  +{0.65p/CAP_scale} ) ( 20m , {0.66p/CAP_scale} ) ( 40m , {0.83p/CAP_scale}
*  +) ( 60m , {1.11p/CAP_scale} ) ( 70m , {1.28p/CAP_scale} ) ( 80m ,
*  +{1.48p/CAP_scale} ) ( 90m , {1.76p/CAP_scale} ) ( 100m , {2.1p/CAP_scale}
*  +) ( 110m , {2.45p/CAP_scale} ) ( 120m , {2.88p/CAP_scale} ) ( 140m ,
*  +{3.4p/CAP_scale} )
*   X_C_VOD V_VALORI_C_VOD 0 VB_D_VOD VREF VCCAP_PSPICE  
*   +CAP_scale={CAP_scale}  Rserie=1
* PSpice:
   E_C_VOD  V_VALORI_C_VOD 0  VALUE={ TABLE( V(VP,VM),-140m , 3.4p ,
   + -120m , 2.88p , -110m , 2.45p , -100m , 2.1p ,    
   + -90m , 1.76p , -80m , 1.48p , -70m , 1.27p, 
   + -60m , 1.095p , -40m , 0.84p , -20m , 0.65p , 
   + 20m , 0.66p , 40m , 0.83p , 60m , 1.11p , 
   + 70m , 1.28p , 80m , 1.48p , 90m , 1.76p , 
   + 100m , 2.1p , 110m , 2.45p , 120m , 2.88p , 
   + 140m , 3.4p )/CAP_scale }
   X_C_VOD V_VALORI_C_VOD 0 VB_D_VOD VREF VCCAP_PSPICE  
   +PARAMS:  CAP_scale={CAP_scale}  Rserie=1     


******************************
*  VCCAP C_VCC 
****************************** 
*Eldo: 
*
*    E_C_VCC V_VALORI_C_VCC 0 TABLE {IF(V(VP,VM)>0,V(Vccp,Vccn),
*    +-V(Vccp,Vccn))}=(-5 {0.31p/CAP_scale}) (-3.3 {0.13p/CAP_scale}) (-2
*    +{1f/CAP_scale}) (2 {1f/CAP_scale}) (3.3 {0.16p/CAP_scale}) (5
*    +{0.36p/CAP_scale})
*    X_C_VCC V_VALORI_C_VCC 0 VB_D_VOD_VCC VREF VCCAP_PSPICE 
*    +CAP_scale=1e-15 Rserie=1
*
*
*PSpice: (al posto della "Vcc negativa fittizia" c'e' un IF V(VP,VM) 
*        sulle due tabelle dei valori di capacita' cioe' se V(VP,VM)>0, caso cioe' di 
*        low-to-high cioe' rise, si considera' la tabella dei valori definiti per 
*        "Vcc positiva" mentre se V(VP,VM)<= 0, caso cioe' di 
*        high-to-low cioe' fall, si considera' la tabella dei valori definiti per
*        "Vcc negativa":
*
    E_C_VCC  v_valori_c_vcc 0  VALUE={ IF(V(VP,VM)>0, 
    +TABLE( V(VCCP,VCCN), 2 , 1f , 3.3 , 0.16p , 5 , 0.36p),
    +TABLE( V(VCCP,VCCN), 2 , 1f , 3.3 , 0.13p , 5 , 0.31p ))/CAP_scale} 
    X_C_VCC  v_valori_c_vcc 0    VB_D_VOD_VCC  VREF  VCCAP_PSPICE 
    +PARAMS: CAP_scale={CAP_scale}  Rserie=1
   
   
    E2_REF NET357 0 VCCN 0 1.0
    EILIM_SINK VB_3_SINK VDEP_SINK VB_3 0 1.0
    E_VREF VREF 0 NET351 0 1.0
    E_RO_3 VB_3 VB_4 VALUE={I(VreadIo)*V(Ro_3_val)}


******************************
*  RO_3 
****************************** 
*Eldo: 
*    
*    E_RO_3_VAL RO_3_VAL 0 PWL(1) VCCP VCCN ( 2 , 35 ) ( 3.3 , 15 ) ( 5.0 ,
*+10 )
*
*PSpice:
    E_RO_3_VAL RO_3_VAL 0 VALUE={TABLE(V(VCCP,VCCN) , 2 , 35 , 3.3 , 15 , 5.0 , 10)}


    E_VDEP_SOURCE_3 VDEP_SOURCE 0 VALUE={IF( abs(I(VreadIo))<1m , 0 ,
+V(val_vdep_source_filtered))}
    E1_REF NET319 0 VCCP 0 1.0
    E_VDEP_SINK_1 VAL_VDEP_SINK 0 VALUE={(54.866515837108246
+-60.88989441930893*V(Vccp,Vccn)
++0.6033182503774749*V(Vccp,Vccn)*V(Vccp,Vccn) ) -5000*I(VreadIo) }
    R_DELAY_VOD VREF VB_D_VOD {R_delay}
    R_ICCSAT_HIGH ICC_OUT_HIGH 0 1K
    RO_2 VB_3 VB_2 1m
    R_RISE_FALL VREF VB_D_G_RF {R_rise_fall}
    RO_1 VREF VB_2 {Ro_1}
    RPROT_IN_P_VCCP NET223 VCCP 15K
    RPROT_IN_M_VCCP VCCP NET343 15K
    R_ICCSAT_LOW ICC_OUT_LOW 0 1K
    RD1 VCCP_ENHANCED VO_DIFF_MINUS {RD}
    RD2 VCCP_ENHANCED VO_DIFF_PLUS {RD}
    R_DELAY_VCC VREF VB_D_VOD_VCC {R_delay}
    R1_REF NET319 NET351 1Meg
    R_GAIN VB_D_G VREF {R1}
    RPROT_IN_M_VCCN VCCN NET355 15K
    R2_REF NET351 NET357 1Meg
    RPROT_IN_P_VCCN NET234 VCCN 15K
    G_IOUT_SOURCED VCCP 0 VALUE={IF(I(VreadIo)>0, I(VreadIo),0)}
    G_ICCSAT VCCP VCCN VALUE={IF( V(VS)>V(Vccp,Vccn)/2 ,
+V(Icc_out_high), V(Icc_out_low) ) }
    G_GAIN VREF VB_D_G VB_D_VOD_VCC VREF 1
    G_DELAY_VOD VB_D_VOD VREF VO_DIFF_MINUS VO_DIFF_PLUS {1/R_delay}
    G_RISE_FALL VREF VB_D_G_RF VB_D_G VREF {1/R_rise_fall}
    G_OUT VREF VB_2 VB_D_G_RF VREF {1/Ro_1}
    G_IOUT_SINKED VCCN 0 VALUE={IF(I(VreadIo)>0, 0, I(VreadIo))}
    G_DELAY_VCC VB_D_VOD_VCC VREF VREF VB_D_VOD {1/R_delay}

*******************************************************************************
*
.PARAM CAP_scale=1e-15
.PARAM A0=1.15976E+06 
.PARAM IEE=10u
.PARAM W=100u
.PARAM L=10u
.PARAM gm_mos=99.72u
.PARAM RD=20k
.PARAM R_delay={RD}
.PARAM R1={A0/(gm_mos*RD)}
.PARAM R_rise_fall=100
.PARAM Ro_1=20
.PARAM VCCP_enhance=-300m
.PARAM VCCN_enhance=-550m
.PARAM V_DPROT=150m
.PARAM Vd_compensazione=-788.4u
.MODEL MOS_N  NMOS LEVEL=1 VTO=+0.65  KP=100E-6
.MODEL DIODE_rf D LEVEL=1 IS=10E-15 N=1 CJO=10f
.MODEL DIODE_NOVd D LEVEL=1 IS=10E-15 N=0.001
.MODEL DIODE_VLIM D LEVEL=1 IS=0.8E-15   
.MODEL DIODE_ILIM D LEVEL=1 IS=0.8E-15  
*
*******************************************************************************

.ENDS TS3021



*******************************************************
******* SUBCKT VOLTAGE CONTROLLED CAPACITOR for SPICE
*******************************************************

.SUBCKT VCCAP_PSPICE Vctrl_plus Vctrl_minus Vout_plus Vout_minus  
+ PARAMS: CAP_scale=1u  Rserie=1
EVin 2 0 VALUE={1/V(Vctrl_plus,Vctrl_minus)}
EV2 8 Vout_plus POLY(2) 6 0 2 0 0 0 0 0 1 0 0 0 0 0
RR1 8 Vout_minus {Rserie}
GI1 0 6 Vout_minus 8 {1/Rserie}
RR2 0 6 100G 
CC1 6 0 {CAP_scale}  
.ENDS VCCAP_PSPICE
*******************************************************************************


