diff --git a/src/spicelib/devices/hicum2/Makefile.am b/src/spicelib/devices/hicum2/Makefile.am index 8f7dd3fbc..3547bb0d3 100644 --- a/src/spicelib/devices/hicum2/Makefile.am +++ b/src/spicelib/devices/hicum2/Makefile.am @@ -4,6 +4,7 @@ noinst_LTLIBRARIES = libhicum2.la libhicum2_la_SOURCES = \ model_class.cpp \ + model_class.hpp \ hicum2.c \ hicum2acld.c \ hicum2ask.c \ diff --git a/src/spicelib/devices/hicum2/hicum2init.h b/src/spicelib/devices/hicum2/hicum2init.h index ca8ab5ebf..d0f045771 100644 --- a/src/spicelib/devices/hicum2/hicum2init.h +++ b/src/spicelib/devices/hicum2/hicum2init.h @@ -1,6 +1,9 @@ #ifndef _HICUMINIT_H #define _HICUMINIT_H +#include "ngspice/config.h" +#include "ngspice/devdefs.h" + extern IFparm HICUMpTable[ ]; extern IFparm HICUMmPTable[ ]; extern char *HICUMnames[ ]; @@ -9,5 +12,6 @@ extern int HICUMmPTSize; extern int HICUMnSize; extern int HICUMiSize; extern int HICUMmSize; +extern SPICEdev HICUMinfo; #endif diff --git a/src/spicelib/devices/hicum2/hicum2mpar.c b/src/spicelib/devices/hicum2/hicum2mpar.c index 2b02a463c..5b348d60e 100644 --- a/src/spicelib/devices/hicum2/hicum2mpar.c +++ b/src/spicelib/devices/hicum2/hicum2mpar.c @@ -14,8 +14,10 @@ Spice3 Implementation: 2019 Dietmar Warning #include "ngspice/const.h" #include "ngspice/ifsim.h" #include "hicum2defs.h" +#include "hicum2init.h" #include "ngspice/sperror.h" #include "ngspice/suffix.h" +#include "model_class.hpp" #define MIN_R 0.001 @@ -24,6 +26,35 @@ HICUMmParam(int param, IFvalue *value, GENmodel *inModel) { HICUMmodel *model = (HICUMmodel*)inModel; + //find name of the model parameter + volatile IFparm *p = &(HICUMinfo.DEVpublic.modelParms); + IFparm *p_end = p + *(HICUMinfo.DEVpublic.numModelParms); + volatile IFparm *para; + volatile int para_found; + para_found=0; + for (int i=0; i < *(HICUMinfo.DEVpublic.numModelParms); i++) { + if (HICUMinfo.DEVpublic.modelParms[i].id == param){ + para_found=i; + break; + }; + }; + + setModelcardPara(HICUMinfo.DEVpublic.modelParms[para_found].keyword, value->rValue); + //printf("%s",HICUMinfo.DEVpublic.modelParms[para_found].keyword); + +// static IFparm * +// find_model_parameter(const char *name, IFdevice *device) +// { +// IFparm *p = device->modelParms; +// IFparm *p_end = p + *(device->numModelParms); + +// for (; p < p_end; p++) +// if (strcmp(name, p->keyword) == 0) +// return p; + +// return NULL; +// } + switch(param) { //Circuit simulator specific parameters diff --git a/src/spicelib/devices/hicum2/model_class.cpp b/src/spicelib/devices/hicum2/model_class.cpp index e7535fd34..122cfbc93 100644 --- a/src/spicelib/devices/hicum2/model_class.cpp +++ b/src/spicelib/devices/hicum2/model_class.cpp @@ -3,183 +3,170 @@ //for the time beeing, HICUM is the first model to use this. #include #include +#include +#include -class Parameter -{ - public: - double value; - double value_min; - double value_max; - double value_default; +Parameter::Parameter(double value_default, double min_value, double max_value) { + value_default = value_default; + value_min = min_value; + value_max = max_value; +}; +void Parameter::setValue(double new_value){ + value = new_value; +}; +double Parameter::getValue(){ + return value; +}; - Parameter(double value_default, double min_value, double max_value) { - value_default = value_default; - value_min = min_value; - value_max = max_value; - }; - void SetValue(double new_value){ - value = new_value; - }; - double GetValue(){ - return value; +double inf = std::numeric_limits::infinity(); + +HICUML2::HICUML2(){ + modelcard = { + {"c10",Parameter(2.0E-30, 0,1)}, + {"qp0",Parameter(2.0E-14,0,1)}, + {"ich",Parameter(0.0,0,inf)}, + {"hf0",Parameter(1.0,0,inf)}, + {"hfe",Parameter(1.0,0,inf)}, + {"hfc",Parameter(1.0,0,inf)}, + {"hjei",Parameter(1.0,0,100)}, + {"ahjei",Parameter(0.0,0,100)}, + {"rhjei",Parameter(1.0,0,10)}, + {"hjci",Parameter(1.0,0,100)}, + {"ibeis",Parameter(1.0E-18, 0,1)}, + {"mbei",Parameter(1.0, 0,10)}, + {"ireis",Parameter(0.0, 0,1)}, + {"mrei",Parameter(2.0, 0,10)}, + {"ibeps",Parameter(0.0, 0,1)}, + {"mbep",Parameter(1.0, 0,10)}, + {"ireps",Parameter(0.0, 0,1)}, + {"mrep",Parameter(2.0, 0,10)}, + {"mcf",Parameter(1.0, 0,10)}, + {"ibcis",Parameter(1.0E-16 , 0,1.0)}, + {"mbci",Parameter(1.0 ,0,10)}, + {"ibcxs",Parameter(0.0 ,0,1.0)}, + {"mbcx",Parameter(1.0,0,10)}, + {"ibets",Parameter (0.0 , 0,50)}, + {"abet",Parameter (40,0,inf)}, + {"tunode",Parameter(1,0,1)}, + {"favl",Parameter(0.0,0,inf)}, + {"qavl",Parameter(0.0,0,inf)}, + {"kavl",Parameter(0.0,0,3)}, + {"alfav",Parameter(0.0 ,-inf,inf)}, + {"alqav",Parameter(0.0 ,-inf,inf)}, + {"alkav",Parameter(0.0,-inf,inf)}, + {"rbi0",Parameter(0.0,0,inf)}, + {"rbx",Parameter(0.0, 0,inf)}, + {"fgeo",Parameter(0.6557, 0,inf)}, + {"fdqr0",Parameter(0.0 , -0.5,100)}, + {"fcrbi",Parameter(0.0, 0,1)}, + {"fqi",Parameter(1.0, 0,1)}, + {"re",Parameter(0.0, 0,inf)}, + {"rcx",Parameter(0.0,0,inf)}, + {"itss",Parameter(0.0 , 0,1.0)}, + {"msf",Parameter(1.0, 0,10)}, + {"iscs",Parameter(0.0, 0,1.0)}, + {"msc",Parameter(1.0, 0,10)}, + {"tsf",Parameter(0.0, 0,inf)}, + {"rsu",Parameter(0.0, 0,inf)}, + {"csu",Parameter(0.0, 0,inf)}, + {"cjei0",Parameter(1.0E-20, 0,inf)}, + {"vdei",Parameter(0.9, 0,10)}, + {"zei",Parameter(0.5,0,1)}, + {"ajei",Parameter(2.5, 1,inf)}, + {"cjep0",Parameter(1.0E-20,0,inf)}, + {"vdep",Parameter(0.9, 0,10)}, + {"zep",Parameter(0.5, 0,1)}, + {"ajep",Parameter(2.5, 1,inf)}, + {"cjci0",Parameter(1.0E-20, 0,inf)}, + {"vdci",Parameter(0.7, 0,10)}, + {"zci",Parameter(0.4, 0,1)}, + {"vptci",Parameter(100, 0,100)}, + {"cjcx0",Parameter(1.0E-20, 0,inf)}, + {"vdcx",Parameter(0.7, 0,10)}, + {"zcx",Parameter(0.4, 0,1)}, + {"vptcx",Parameter(100,0,100)}, + {"fbcpar",Parameter(0.0,0,1)}, + {"fbepar",Parameter(1.0,0,1)}, + {"cjs0",Parameter( 0.0, 0,inf)}, + {"vds",Parameter(0.6,0,10)}, + {"zs",Parameter(0.5, 0,1)}, + {"vpts",Parameter(100,0,100)}, + {"cscp0",Parameter(0.0, 0,inf)}, + {"vdsp",Parameter(0.6, 0,10)}, + {"zsp",Parameter(0.5, 0,1)}, + {"vptsp",Parameter(100, 0,100)}, + {"t0",Parameter(0.0, 0,inf)}, + {"dt0h",Parameter(0.0,-inf,inf)}, + {"tbvl",Parameter(0.0,-inf,inf)}, + {"tef0",Parameter(0.0, 0,inf)}, + {"gtfe",Parameter(1.0, 0,10)}, + {"thcs",Parameter(0.0, 0,inf)}, + {"ahc",Parameter(0.1, 0,50)}, + {"fthc",Parameter(0.0, 0,1)}, + {"rci0",Parameter(150, 0,inf)}, + {"vlim",Parameter(0.5, 0,10)}, + {"vces",Parameter(0.1,0,1)}, + {"vpt",Parameter(100.0,0,inf)}, + {"aick",Parameter(1e-3,0,10)}, + {"delck",Parameter(2.0, 0,10)}, + {"tr",Parameter(0.0, 0,inf)}, + {"vcbar",Parameter(0.0,0,1)}, + {"icbar",Parameter(0.0,0,1)}, + {"acbar",Parameter(0.01,0,10)}, + {"cbepar",Parameter(0.0,0,inf)}, + {"cbcpar",Parameter(0.0,0,inf)}, + {"alqf",Parameter(0.167, 0,1)}, + {"alit",Parameter(0.333, 0,1)}, + {"flnqs",Parameter(0,-10,10)}, + {"kf",Parameter(0.0,0,inf)}, + {"af",Parameter(2.0,0,10)}, + {"cfbe",Parameter(-1,-2,-1)}, + {"flcono",Parameter(0,0,1)}, + {"kfre",Parameter(0.0,0,inf)}, + {"afre",Parameter(2.0,0,10)}, + {"latl",Parameter(0.0,0,inf)}, + {"vgb",Parameter(1.17,0,10)}, + {"alt0",Parameter(0.0,-inf,inf)}, + {"kt0",Parameter(0.0,-inf,inf)}, + {"zetaci",Parameter(0.0,-10,10)}, + {"alvs",Parameter(0.0,-inf,inf)}, + {"alces",Parameter(0.0,-inf,inf)}, + {"zetarbi",Parameter(0.0,-10,10)}, + {"zetarbx",Parameter(0.0,-10,10)}, + {"zetarcx",Parameter(0.0,-10,10)}, + {"zetare",Parameter(0.0,-10,10)}, + {"zetacx",Parameter(1.0,-10,10)}, + {"vge",Parameter(1.17,0,10)}, + {"vgc",Parameter(1.17,0,10)}, + {"vgs",Parameter(1.17,0,10)}, + {"f1vg",Parameter(-1.02377e-4,-inf,inf)}, + {"f2vg",Parameter(4.3215e-4,-inf,inf)}, + {"zetact",Parameter(3.0,-10,10)}, + {"zetabet",Parameter(3.5,-10,10)}, + {"alb",Parameter(0.0,-inf,inf)}, + {"dvgbe",Parameter(0,-inf,inf)}, + {"zetahjei",Parameter(1,-10,10)}, + {"zetavgbe",Parameter(1,-10,10)}, + {"flsh",Parameter(0,0,2)}, + {"rth",Parameter(0.0,0,inf)}, + {"zetarth",Parameter(0.0,-10,10)}, + {"alrth",Parameter(0.0,-10,10)}, + {"cth",Parameter(0.0,0,inf)}, + {"flcomp",Parameter(0.0,0,inf)}, + {"tnom",Parameter(27.0,-inf,inf)}, + {"dt",Parameter(0.0,-inf,inf)}, + {"type",Parameter(1,-1,1)}, }; }; -class NGSpiceModel -{ - public: - std::unordered_map modelcard; //the modelcard of the model -}; - -int inf = std::numeric_limits::infinity(); - -class HICUML2 : public NGSpiceModel -{ - public: - HICUML2(){ - //{"example_para", para} - modelcard = { - {"c10",Parameter(2.0E-30, 0,1)}, - {"qp0",Parameter(2.0E-14,0,1)}, - {"ich",Parameter(0.0,0,inf)}, - {"hf0",Parameter(1.0,0,inf)}, - {"hfe",Parameter(1.0,0,inf)}, - {"hfc",Parameter(1.0,0,inf)}, - {"hjei",Parameter(1.0,0,100)}, - {"ahjei",Parameter(0.0,0,100)}, - {"rhjei",Parameter(1.0,0,10)}, - {"hjci",Parameter(1.0,0,100)}, - {"ibeis",Parameter(1.0E-18, 0,1)}, - {"mbei",Parameter(1.0, 0,10)}, - {"ireis",Parameter(0.0, 0,1)}, - {"mrei",Parameter(2.0, 0,10)}, - {"ibeps",Parameter(0.0, 0,1)}, - {"mbep",Parameter(1.0, 0,10)}, - {"ireps",Parameter(0.0, 0,1)}, - {"mrep",Parameter(2.0, 0,10)}, - {"mcf",Parameter(1.0, 0,10)}, - {"ibcis",Parameter(1.0E-16 , 0,1.0)}, - {"mbci",Parameter(1.0 ,0,10)}, - {"ibcxs",Parameter(0.0 ,0,1.0)}, - {"mbcx",Parameter(1.0,0,10)}, - {"ibets",Parameter (0.0 , 0,50)}, - {"abet",Parameter (40,0,inf)}, - {"tunode",Parameter(1,0,1)}, - {"favl",Parameter(0.0,0,inf)}, - {"qavl",Parameter(0.0,0,inf)}, - {"kavl",Parameter(0.0,0,3)}, - {"alfav",Parameter(0.0 ,-inf,inf)}, - {"alqav",Parameter(0.0 ,-inf,inf)}, - {"alkav",Parameter(0.0,-inf,inf)}, - {"rbi0",Parameter(0.0,0,inf)}, - {"rbx",Parameter(0.0, 0,inf)}, - {"fgeo",Parameter(0.6557, 0,inf)}, - {"fdqr0",Parameter(0.0 , -0.5,100)}, - {"fcrbi",Parameter(0.0, 0,1)}, - {"fqi",Parameter(1.0, 0,1)}, - {"re",Parameter(0.0, 0,inf)}, - {"rcx",Parameter(0.0,0,inf)}, - {"itss",Parameter(0.0 , 0,1.0)}, - {"msf",Parameter(1.0, 0,10)}, - {"iscs",Parameter(0.0, 0,1.0)}, - {"msc",Parameter(1.0, 0,10)}, - {"tsf",Parameter(0.0, 0,inf)}, - {"rsu",Parameter(0.0, 0,inf)}, - {"csu",Parameter(0.0, 0,inf)}, - {"cjei0",Parameter(1.0E-20, 0,inf)}, - {"vdei",Parameter(0.9, 0,10)}, - {"zei",Parameter(0.5,0,1)}, - {"ajei",Parameter(2.5, 1,inf)}, - {"cjep0",Parameter(1.0E-20,0,inf)}, - {"vdep",Parameter(0.9, 0,10)}, - {"zep",Parameter(0.5, 0,1)}, - {"ajep",Parameter(2.5, 1,inf)}, - {"cjci0",Parameter(1.0E-20, 0,inf)}, - {"vdci",Parameter(0.7, 0,10)}, - {"zci",Parameter(0.4, 0,1)}, - {"vptci",Parameter(100, 0,100)}, - {"cjcx0",Parameter(1.0E-20, 0,inf)}, - {"vdcx",Parameter(0.7, 0,10)}, - {"zcx",Parameter(0.4, 0,1)}, - {"vptcx",Parameter(100,0,100)}, - {"fbcpar",Parameter(0.0,0,1)}, - {"fbepar",Parameter(1.0,0,1)}, - {"cjs0",Parameter( 0.0, 0,inf)}, - {"vds",Parameter(0.6,0,10)}, - {"zs",Parameter(0.5, 0,1)}, - {"vpts",Parameter(100,0,100)}, - {"cscp0",Parameter(0.0, 0,inf)}, - {"vdsp",Parameter(0.6, 0,10)}, - {"zsp",Parameter(0.5, 0,1)}, - {"vptsp",Parameter(100, 0,100)}, - {"t0",Parameter(0.0, 0,inf)}, - {"dt0h",Parameter(0.0,-inf,inf)}, - {"tbvl",Parameter(0.0,-inf,inf)}, - {"tef0",Parameter(0.0, 0,inf)}, - {"gtfe",Parameter(1.0, 0,10)}, - {"thcs",Parameter(0.0, 0,inf)}, - {"ahc",Parameter(0.1, 0,50)}, - {"fthc",Parameter(0.0, 0,1)}, - {"rci0",Parameter(150, 0,inf)}, - {"vlim",Parameter(0.5, 0,10)}, - {"vces",Parameter(0.1,0,1)}, - {"vpt",Parameter(100.0,0,inf)}, - {"aick",Parameter(1e-3,0,10)}, - {"delck",Parameter(2.0, 0,10)}, - {"tr",Parameter(0.0, 0,inf)}, - {"vcbar",Parameter(0.0,0,1)}, - {"icbar",Parameter(0.0,0,1)}, - {"acbar",Parameter(0.01,0,10)}, - {"cbepar",Parameter(0.0,0,inf)}, - {"cbcpar",Parameter(0.0,0,inf)}, - {"alqf",Parameter(0.167, 0,1)}, - {"alit",Parameter(0.333, 0,1)}, - {"flnqs",Parameter(0,-10,10)}, - {"kf",Parameter(0.0,0,inf)}, - {"af",Parameter(2.0,0,10)}, - {"cfbe",Parameter(-1,-2,-1)}, - {"flcono",Parameter(0,0,1)}, - {"kfre",Parameter(0.0,0,inf)}, - {"afre",Parameter(2.0,0,10)}, - {"latl",Parameter(0.0,0,inf)}, - {"vgb",Parameter(1.17,0,10)}, - {"alt0",Parameter(0.0,-inf,inf)}, - {"kt0",Parameter(0.0,-inf,inf)}, - {"zetaci",Parameter(0.0,-10,10)}, - {"alvs",Parameter(0.0,-inf,inf)}, - {"alces",Parameter(0.0,-inf,inf)}, - {"zetarbi",Parameter(0.0,-10,10)}, - {"zetarbx",Parameter(0.0,-10,10)}, - {"zetarcx",Parameter(0.0,-10,10)}, - {"zetare",Parameter(0.0,-10,10)}, - {"zetacx",Parameter(1.0,-10,10)}, - {"vge",Parameter(1.17,0,10)}, - {"vgc",Parameter(1.17,0,10)}, - {"vgs",Parameter(1.17,0,10)}, - {"f1vg",Parameter(-1.02377e-4,-inf,inf)}, - {"f2vg",Parameter(4.3215e-4,-inf,inf)}, - {"zetact",Parameter(3.0,-10,10)}, - {"zetabet",Parameter(3.5,-10,10)}, - {"alb",Parameter(0.0,-inf,inf)}, - {"dvgbe",Parameter(0,-inf,inf)}, - {"zetahjei",Parameter(1,-10,10)}, - {"zetavgbe",Parameter(1,-10,10)}, - {"flsh",Parameter(0,0,2)}, - {"rth",Parameter(0.0,0,inf)}, - {"zetarth",Parameter(0.0,-10,10)}, - {"alrth",Parameter(0.0,-10,10)}, - {"cth",Parameter(0.0,0,inf)}, - {"flcomp",Parameter(0.0,0,inf)}, - {"tnom",Parameter(27.0,-inf,inf)}, - {"dt",Parameter(0.0,-inf,inf)}, - {"type",Parameter(1,-1,1)}, - }; - }; -}; - -int main(){ - double value; - HICUML2 hicumL2_example = HICUML2(); - value = hicumL2_example.modelcard.at("c10").GetValue(); -} +HICUML2 hicumL2_example = HICUML2(); +void setModelcardPara(const char* para_name, double value){ + Parameter para(0,0,0); + try { + para = hicumL2_example.modelcard.at(para_name); + } catch (const std::out_of_range& oor) { + printf("Experimental HICUM: did not find parameter with name %s.\n", para_name); + } + para.setValue(value); +}; \ No newline at end of file diff --git a/src/spicelib/devices/hicum2/model_class.hpp b/src/spicelib/devices/hicum2/model_class.hpp new file mode 100644 index 000000000..851851fbd --- /dev/null +++ b/src/spicelib/devices/hicum2/model_class.hpp @@ -0,0 +1,46 @@ +#ifndef model_class +#define model_class +//this file contains a class definition for models to be integrated into ngspice +//later, it should be moved somewhere else. +//for the time beeing, HICUM is the first model to use this. +#ifdef __cplusplus +#include +#include + +class Parameter +{ + public: + double value; + double value_min; + double value_max; + double value_default; + + Parameter(double value_default, double min_value, double max_value); + void setValue(double new_value); + double getValue(); +}; + +class NGSpiceModel +{ + public: + std::unordered_map modelcard; //the modelcard of the model +}; + +class HICUML2 : public NGSpiceModel +{ + public: + HICUML2(); +}; +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +//methods that are exposed to C +extern void setModelcardPara(const char* para_name, double value); + +#ifdef __cplusplus +} +#endif +#endif \ No newline at end of file