From ba7e4a075163449047875959d4868312acf1a826 Mon Sep 17 00:00:00 2001 From: Markus Mueller Date: Sun, 9 Aug 2020 19:37:54 +0200 Subject: [PATCH] restructure of code --- src/spicelib/devices/hicum2/hicum_vae.cpp | 240 ++++++++++++++++++++ src/spicelib/devices/hicum2/hicum_vae.hpp | 62 +++++ src/spicelib/devices/hicum2/model_class.cpp | 229 ------------------- src/spicelib/devices/hicum2/model_class.hpp | 47 +--- 4 files changed, 308 insertions(+), 270 deletions(-) create mode 100644 src/spicelib/devices/hicum2/hicum_vae.cpp create mode 100644 src/spicelib/devices/hicum2/hicum_vae.hpp diff --git a/src/spicelib/devices/hicum2/hicum_vae.cpp b/src/spicelib/devices/hicum2/hicum_vae.cpp new file mode 100644 index 000000000..bcd3736f1 --- /dev/null +++ b/src/spicelib/devices/hicum2/hicum_vae.cpp @@ -0,0 +1,240 @@ + +#include +#include + +double inf = std::numeric_limits::infinity(); +HICUML2::HICUML2(){ + this->spice_model_struct.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)}, + }; + nodes = { + Node((char*)"B"), + Node((char*)"Bi"), + Node((char*)"Bp"), + Node((char*)"C"), + Node((char*)"Ci"), + Node((char*)"E"), + Node((char*)"Ei"), + Node((char*)"S"), + Node((char*)"T"), + }; + // set model specific constants + this->n_external_nodes = sizeof(this->MODELnames); + this->model_size = sizeof(this->spice_model_struct); + this->instance_size = sizeof(this->spice_instance_struct); +}; + + +HICUML2 hicumL2_model = 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); +// }; + + + +SPICEdev * get_hicum_info() +{ + hicumL2_model.model_info = { + .DEVpublic = { + .name = hicumL2_model.name, + .description = hicumL2_model.description, + .terms = &hicumL2_model.n_external_nodes, + .numNames = &hicumL2_model.n_external_nodes, + .termNames = hicumL2_model.MODELnames, + .numInstanceParms = &HICUMpTSize, + .instanceParms = HICUMpTable, + .numModelParms = &HICUMmPTSize, + .modelParms = HICUMmPTable, + .flags = DEV_DEFAULT, + + #ifdef XSPICE + .cm_func = NULL, + .num_conn = 0, + .conn = NULL, + .num_param = 0, + .param = NULL, + .num_inst_var = 0, + .inst_var = NULL, + #endif + }, + + .DEVparam = this->test,//HICUMparam, + .DEVmodParam = this->MODELmParam, + .DEVload = HICUMload, + .DEVsetup = HICUMsetup, + .DEVunsetup = HICUMunsetup, + .DEVpzSetup = HICUMsetup, + .DEVtemperature = HICUMtemp, + .DEVtrunc = HICUMtrunc, + .DEVfindBranch = NULL, + .DEVacLoad = HICUMacLoad, + .DEVaccept = NULL, + .DEVdestroy = NULL, + .DEVmodDelete = NULL, + .DEVdelete = NULL, + .DEVsetic = HICUMgetic, + .DEVask = HICUMask, + .DEVmodAsk = HICUMmAsk, + .DEVpzLoad = HICUMpzLoad, + .DEVconvTest = HICUMconvTest, + .DEVsenSetup = NULL, + .DEVsenLoad = NULL, + .DEVsenUpdate = NULL, + .DEVsenAcLoad = NULL, + .DEVsenPrint = NULL, + .DEVsenTrunc = NULL, + .DEVdisto = NULL, + .DEVnoise = HICUMnoise, + .DEVsoaCheck = HICUMsoaCheck, + .DEVinstSize = &this->instance_size, + .DEVmodSize = &this->model_size, + + #ifdef CIDER + .DEVdump = NULL, + .DEVacct = NULL, + #endif + }; + return &(hicumL2_model.model_info); +} +//this way we can abstract: we expoe get_hicum_info to NGspice, but use +// the genereric object oriented function. diff --git a/src/spicelib/devices/hicum2/hicum_vae.hpp b/src/spicelib/devices/hicum2/hicum_vae.hpp new file mode 100644 index 000000000..22d82feb2 --- /dev/null +++ b/src/spicelib/devices/hicum2/hicum_vae.hpp @@ -0,0 +1,62 @@ +#ifndef hicum_vae +#define hicum_vae +//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 +#include +#include +extern "C" { +#include "ngspice/cktdefs.h" +#include "ngspice/ngspice.h" +#include "ngspice/smpdefs.h" +#include "ngspice/const.h" +#include "ngspice/sperror.h" +#include "ngspice/ifsim.h" +#include "ngspice/devdefs.h" +#include "ngspice/suffix.h" +} +class HICUML2 : public NGSpiceModel +{ + public: + char * name = "hl2"; + char * description = "high-speed HBT model"; //the description of the model + char * MODELnames[5] = { + "collector", + "base", + "emitter", + "substrate", + "temp" + }; + HICUML2(); +}; +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +extern int HICUMacLoad(GENmodel *,CKTcircuit*); +extern int HICUMask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*); +extern int HICUMconvTest(GENmodel*,CKTcircuit*); +extern int HICUMdelete(GENinstance*); +extern int HICUMgetic(GENmodel*,CKTcircuit*); +extern int HICUMload(GENmodel*,CKTcircuit*); +extern int HICUMmAsk(CKTcircuit*,GENmodel*,int,IFvalue*); +extern int HICUMmParam(int,IFvalue*,GENmodel*); +extern int HICUMparam(int,IFvalue*,GENinstance*,IFvalue*); +extern int HICUMpzLoad(GENmodel*, CKTcircuit*, SPcomplex*); +extern int HICUMsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); +extern int HICUMunsetup(GENmodel*,CKTcircuit*); +extern int HICUMtemp(GENmodel*,CKTcircuit*); +extern int HICUMtrunc(GENmodel*,CKTcircuit*,double*); +extern int HICUMnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); +extern int HICUMsoaCheck(CKTcircuit *, GENmodel *); +extern SPICEdev * get_hicum_info(void); + +#ifdef __cplusplus +} +#endif +#endif \ No newline at end of file diff --git a/src/spicelib/devices/hicum2/model_class.cpp b/src/spicelib/devices/hicum2/model_class.cpp index 8605791fc..1a883fefd 100644 --- a/src/spicelib/devices/hicum2/model_class.cpp +++ b/src/spicelib/devices/hicum2/model_class.cpp @@ -70,235 +70,6 @@ Branch::Branch(Node * node_from,Node * node_to,std::vector depends){ branch_dependencies = depends; }; -double inf = std::numeric_limits::infinity(); -SPICEdev * NGSpiceModel::get_model_info() -{ - this->model_info = { - .DEVpublic = { - .name = this->name, - .description = "High Current Model for BJT", - .terms = &this->n_external_nodes, - .numNames = &this->n_external_nodes, - .termNames = this->MODELnames, - .numInstanceParms = &HICUMpTSize, - .instanceParms = HICUMpTable, - .numModelParms = &HICUMmPTSize, - .modelParms = HICUMmPTable, - .flags = DEV_DEFAULT, - #ifdef XSPICE - .cm_func = NULL, - .num_conn = 0, - .conn = NULL, - .num_param = 0, - .param = NULL, - .num_inst_var = 0, - .inst_var = NULL, - #endif - }, - .DEVparam = HICUMparam, - .DEVmodParam = this->MODELmParam, - .DEVload = HICUMload, - .DEVsetup = HICUMsetup, - .DEVunsetup = HICUMunsetup, - .DEVpzSetup = HICUMsetup, - .DEVtemperature = HICUMtemp, - .DEVtrunc = HICUMtrunc, - .DEVfindBranch = NULL, - .DEVacLoad = HICUMacLoad, - .DEVaccept = NULL, - .DEVdestroy = NULL, - .DEVmodDelete = NULL, - .DEVdelete = NULL, - .DEVsetic = HICUMgetic, - .DEVask = HICUMask, - .DEVmodAsk = HICUMmAsk, - .DEVpzLoad = HICUMpzLoad, - .DEVconvTest = HICUMconvTest, - .DEVsenSetup = NULL, - .DEVsenLoad = NULL, - .DEVsenUpdate = NULL, - .DEVsenAcLoad = NULL, - .DEVsenPrint = NULL, - .DEVsenTrunc = NULL, - .DEVdisto = NULL, - .DEVnoise = HICUMnoise, - .DEVsoaCheck = HICUMsoaCheck, - .DEVinstSize = &this->instance_size, - .DEVmodSize = &this->model_size, - - #ifdef CIDER - .DEVdump = NULL, - .DEVacct = NULL, - #endif - }; - return &(this->model_info); -} - -HICUML2::HICUML2(){ - this->spice_model_struct.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)}, - }; - nodes = { - Node((char*)"B"), - Node((char*)"Bi"), - Node((char*)"Bp"), - Node((char*)"C"), - Node((char*)"Ci"), - Node((char*)"E"), - Node((char*)"Ei"), - Node((char*)"S"), - Node((char*)"T"), - }; - // set model specific constants - this->n_external_nodes = sizeof(this->MODELnames); - this->model_size = sizeof(this->spice_model_struct); - this->instance_size = sizeof(this->spice_instance_struct); -}; - -//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 index 068cf1682..b4d9d26a4 100644 --- a/src/spicelib/devices/hicum2/model_class.hpp +++ b/src/spicelib/devices/hicum2/model_class.hpp @@ -81,6 +81,8 @@ typedef struct sGENinstance { const int HICUMtempNode; /* number of the temperature node of the hicum */ }; +extern "C" typedef int spice_function(int x); + class NGSpiceModel { public: @@ -90,8 +92,8 @@ class NGSpiceModel int n_external_nodes; //the name of the model int model_size; //the size of the model structure int instance_size; //the size of the instance structure - char * name ; //the name of the model - const char * description ; //the description of the model + char * name; //the name of the model + char * description; //the description of the model char *MODELnames[]; // array of the names of the external nodes //spice data structures sGENmodel spice_model_struct; @@ -99,48 +101,11 @@ class NGSpiceModel SPICEdev model_info; //spice methods SPICEdev * get_model_info(); - int MODELacLoad(GENmodel *,CKTcircuit*); - int MODELask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*); - int MODELconvTest(GENmodel*,CKTcircuit*); - int MODELdelete(GENinstance*); - int MODELgetic(GENmodel*,CKTcircuit*); - //extern int HICUMload(GENmodel*,CKTcircuit*);//moved to hicumL2.hpp - int MODELmAsk(CKTcircuit*,GENmodel*,int,IFvalue*); - int MODELmParam(int,IFvalue*,GENmodel*); - int MODELparam(int,IFvalue*,GENinstance*,IFvalue*); - int MODELpzLoad(GENmodel*, CKTcircuit*, SPcomplex*); - int MODELsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); - int MODELunsetup(GENmodel*,CKTcircuit*); - // extern int HICUMtemp(GENmodel*,CKTcircuit*); // moved to hicum2temp.hpp - int MODELtrunc(GENmodel*,CKTcircuit*,double*); - int MODELnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); - int MODELsoaCheck(CKTcircuit *, GENmodel *); + spice_function test; }; -class HICUML2 : public NGSpiceModel -{ - public: - const char * name = "hl2"; - const char * description = "high-speed HBT model"; //the description of the model - char *MODELnames[5] = { - "collector", - "base", - "emitter", - "substrate", - "temp" - }; - 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