working on hicum object oriented

This commit is contained in:
Markus Mueller 2020-08-08 16:59:10 +02:00
parent 75ea194675
commit 18829c6779
2 changed files with 118 additions and 53 deletions

View File

@ -13,6 +13,7 @@ extern "C" {
#include "ngspice/sperror.h"
#include "ngspice/ifsim.h"
#include "ngspice/suffix.h"
#include "ngspice/devdefs.h"
}
Parameter::Parameter(double value_default, double min_value, double max_value) {
@ -52,40 +53,8 @@ double Parameter::getValue(){
};
Node::Node(CKTcircuit * ckt, NGSpiceModel * model , char * name){
/* Node constructor.
Output
-----
ckt : CKTcircuit *
The circuit in which the node shall be allocated.
model : NGSpiceModel *
The model that contains the node.
name : char *
The name of the node.
*/
int error = 0;
CKTnode *tmp;
CKTnode *tmpNode;
IFuid tmpName;
ckt = ckt;
Node::Node( char * name){
name = name;
//todo node collapsing?
//allocate the node
error = CKTmkVolt(ckt,&tmp, (char*)model->name, name);
//if(error) return(error); //why should there be an error?
id = tmp->number;
// if (ckt->CKTcopyNodesets) {
// if (CKTinst2Node(ckt,here,2,&tmpNode,&tmpName)==OK) {
// if (tmpNode->nsGiven) {
// tmp->nodeset=tmpNode->nodeset;
// tmp->nsGiven=tmpNode->nsGiven;
// }
// }
// }
};
double Node::getPotential(){
@ -96,13 +65,78 @@ double Node::getPotential(){
Branch::Branch(Node * node_from,Node * node_to,std::vector<Node*> depends){
node_from = node_from;
node_to = node_to;
branch_dependencies = depends;
node_from = node_from;
node_to = node_to;
branch_dependencies = depends;
};
double inf = std::numeric_limits<double>::infinity();
SPICEdev * NGSpiceModel::get_model_info()
{
SPICEdev model_info = {
.DEVpublic = {
.name = this.name,
.description = "High Current Model for BJT",
.terms = &this->n_external_nodes,
.numNames = &HICUMnSize,
.termNames = HICUMnames,
.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 = HICUMmParam,
.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 = &HICUMiSize,
.DEVmodSize = &HICUMmSize,
#ifdef CIDER
.DEVdump = NULL,
.DEVacct = NULL,
#endif
};
return &modelinfo;
}
HICUML2::HICUML2(){
modelcard = {
{"c10",Parameter(2.0E-30, 0,1)},
@ -240,16 +274,36 @@ HICUML2::HICUML2(){
{"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"),
};
external_nodes = {
Node((char*)"B"),
Node((char*)"C"),
Node((char*)"E"),
Node((char*)"S"),
Node((char*)"T"),
};
this->n_external_nodes = static_cast<int>(this->external_nodes.size());
this->description = "High Current Model for BJT";
};
HICUML2 hicumL2_example = HICUML2();
//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);
};
// 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);
// };

View File

@ -9,6 +9,13 @@
#include <limits>
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 NGSpiceModel;
@ -33,16 +40,17 @@ class Node
char * name;
CKTcircuit * ckt; //pointer to the circuit in which the node resides
double getPotential();
Node(CKTcircuit * ckt, NGSpiceModel * model, char * name);
//Node(CKTcircuit * ckt, NGSpiceModel * model, char * name);
Node(char * name);
};
class Branch
{
//A branch specifies a current that flows from node_from to node_to
public:
double value; //the current of the branch
std::unordered_map<int, double> derivatives; //a map whose keys are node ids and the value is the derivative with that node
std::vector<Node*> branch_dependencies; //all nodes for which a derivative is defined
double value; //the current of the branch
std::unordered_map<int, double> derivatives; //a map whose keys are node ids and the value is the derivative with that node
std::vector<Node*> branch_dependencies; //all nodes for which a derivative is defined
Node * node_from; //the node where the current originates
Node * node_to; //the node where the current is flowing to
Branch(Node * node_from, Node * node_to, std::vector<Node*> depends);
@ -52,9 +60,11 @@ class NGSpiceModel
{
public:
std::unordered_map<const char *, Parameter> modelcard; //the modelcard of the model
std::vector<Node> nodes; //the nodes of the model
std::vector<Branch> branches; //the branches of the model
const char * name = "None"; //the branches of the model
std::vector<Node> nodes; //all nodes of the model, including internal and externals
std::vector<Node> external_nodes; //the external nodes of the model
std::vector<Branch> branches; //the branches of the model
int n_external_nodes; //the name of the model
const char * name = "None"; //the name of the model
};
class HICUML2 : public NGSpiceModel
@ -62,6 +72,7 @@ class HICUML2 : public NGSpiceModel
public:
const char * name = "hl2";
HICUML2();
SPICEdev * get_model_info(); // return the SPICEdev
};
#endif