--- N_DEV_ADMSHBT_X.h_unmolested	2011-10-20 09:37:48.000000000 -0600
+++ N_DEV_ADMSHBT_X.h_HACKED	2011-10-20 09:38:07.000000000 -0600
@@ -134,6 +134,8 @@
      const vector< vector<int> > & DAEdFdxJacLIDVec,
      const vector< vector<int> > & DAEdBdxJacLIDVec );
   // end of new DAE stuff
+  // thermal voltage at kelvin temperature temp)
+  template <typename T> static inline T adms_vt(T temp) {return(CONSTKoverQ*temp);};
  protected:
  private:
   // Limited exponential --- NOT what verilog LRM says, but what qucs, 
@@ -395,12 +397,10 @@
   // "TEMP" parameter to use
   double admsInstTemp;
 
-  // thermal voltage at kelvin temperature temp)
-  inline double adms_vt(double temp) {return(CONSTKoverQ*temp);};
-
   static vector< vector<int> > jacStamp;
   static vector<int> jacMap;
-  static vector< vector<int> > jacMap2;    friend class N_DEV_ADMSHBT_XModel;
+  static vector< vector<int> > jacMap2;    
+  friend class N_DEV_ADMSHBT_XModel;
 
 
 };
@@ -437,23 +437,26 @@
 
 
   // Analog Function Vt
-  template<typename ScalarT> ScalarT Vt(ScalarT U, ScalarT Ud)
+  template<typename RetScalarT,typename Arg1ScalarT, typename Arg2ScalarT> RetScalarT Vt(Arg1ScalarT U, Arg2ScalarT Ud)
   {
 
 
-    ScalarT Vt;
-    ScalarT Vch;
-    ScalarT VF;
+    RetScalarT Vt;
+    Arg2ScalarT Vch;
+    Arg2ScalarT VF;
+    RetScalarT exparg;
     {
       Vch = (0.1*Ud);
       VF = (0.9*Ud);
       if ((U<VF))
       {
-        Vt = (U-(Vch*log((1.0+exp(((U-VF)/Vch))))));
+        exparg=((U-VF)/Vch);
+        Vt = (U-(Vch*log((1.0+exp(exparg)))));
       }
       else
       {
-        Vt = (VF-(Vch*log((1.0+exp(((VF-U)/Vch))))));
+        exparg=((VF-U)/Vch);
+        Vt = (VF-(Vch*log((1.0+exp(exparg)))));
       }
     }
     return(Vt);
@@ -461,42 +464,50 @@
 
 
   // Analog Function diode
-  template<typename ScalarT> ScalarT diode(ScalarT U, ScalarT Is, ScalarT Ug, ScalarT N, ScalarT AREA, ScalarT TJ, ScalarT TNOM)
+  template<typename RetScalarT,typename Arg1ScalarT,typename Arg3ScalarT,typename Arg4ScalarT,typename Arg6ScalarT> 
+    RetScalarT diode(Arg1ScalarT U, double Is, Arg3ScalarT Ug, Arg4ScalarT N, double AREA, Arg6ScalarT TJ, double TNOM)
   {
 
 
-    ScalarT diode;
-    ScalarT VTH0;
-    ScalarT VTHJ;
-    ScalarT VTHNOM;
-    ScalarT maxi;
-    ScalarT Tmax;
-    ScalarT TJM;
-    ScalarT KDURCHQ;
-    ScalarT lnIs;
+    RetScalarT diode;
+    RetScalarT exparg1;
+    RetScalarT exparg2;
+    RetScalarT VTH0;
+    Arg6ScalarT VTHJ;
+    double VTHNOM;
+    double maxi;
+    Arg3ScalarT Tmax;
+    Arg6ScalarT TJM;
+    Arg6ScalarT TJM_arg1;
+    double KDURCHQ;
+    double lnIs;
     {
-      VTH0 = adms_vt((20.0+273.15));
-      VTHNOM = adms_vt((TNOM+273.15));
+      VTH0 = N_DEV_ADMSHBT_XInstance::adms_vt((20.0+273.15));
+      VTHNOM = N_DEV_ADMSHBT_XInstance::adms_vt((TNOM+273.15));
       KDURCHQ = 0.861708692e-4;
       lnIs = log((Is*AREA));
       maxi = log(1e6);
       if (((maxi<(Ug/VTHNOM))&&(U<0.0)))
       {
         Tmax = (((Ug*VTHNOM)/((Ug-(maxi*VTHNOM))*KDURCHQ))-273.15);
-        TJM = Vt(TJ,Tmax);
+        TJM = Vt<Arg6ScalarT>(TJ,Tmax);
       }
       else
       {
         TJM = TJ;
       }
-      VTHJ = adms_vt((TJM+273.15));
+      TJM_arg1=TJM+273.15;
+      VTHJ = N_DEV_ADMSHBT_XInstance::adms_vt((TJM_arg1));
       if ((Ug>0.0))
       {
-        diode = (exp_soft(((((U/(N*VTHJ))+(Ug/VTHNOM))-(Ug/VTHJ))+lnIs))-exp_soft((((Ug/VTHNOM)-(Ug/VTHJ))+lnIs)));
+        exparg1=((((U/(N*VTHJ))+(Ug/VTHNOM))-(Ug/VTHJ))+lnIs);
+        exparg2=(((Ug/VTHNOM)-(Ug/VTHJ))+lnIs);
+        diode = (exp_soft(exparg1)-exp_soft(exparg2));
       }
       else
       {
-        diode = (exp_soft(((U/(N*VTH0))+lnIs))-(Is*AREA));
+        exparg1=((U/(N*VTH0))+lnIs);
+        diode = (exp_soft(exparg1)-(Is*AREA));
       }
     }
     return(diode);
@@ -559,17 +570,17 @@
 
 
   // Analog Function charge
-  template<typename ScalarT> ScalarT charge(ScalarT U, ScalarT C0, ScalarT Ud, ScalarT m, ScalarT Area)
+  template< typename RetScalarT> RetScalarT charge(RetScalarT U, double C0, double Ud, double m, double Area)
   {
 
 
-    ScalarT charge;
-    ScalarT Vj;
-    ScalarT Vjo;
-    ScalarT VF;
+    RetScalarT charge;
+    RetScalarT Vj;
+    double Vjo;
+    double VF;
     {
-      Vj = Vt(U,Ud);
-      Vjo = Vt(0.0,Ud);
+      Vj = Vt<RetScalarT>(U,Ud);
+      Vjo = Vt<double>(0.0,Ud);
       VF = (0.9*Ud);
       if ((m==1.0))
       {
