From 5514cb206bab6adc231945321e8d75ae4db5848f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81rp=C3=A1d=20B=C5=B1rmen?= Date: Sat, 30 Nov 2024 22:08:37 +0100 Subject: [PATCH 1/3] Exposed more $simparams via OSDI. initializeLimiting, epsmin, reltol, vntol, abstol --- src/osdi/osdiload.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/osdi/osdiload.c b/src/osdi/osdiload.c index 094d55d58..c07bb377a 100644 --- a/src/osdi/osdiload.c +++ b/src/osdi/osdiload.c @@ -23,12 +23,15 @@ #include #include -#define NUM_SIM_PARAMS 5 +#define NUM_SIM_PARAMS 10 char *sim_params[NUM_SIM_PARAMS + 1] = { - "gdev", "gmin", "tnom", "simulatorVersion", "sourceScaleFactor", NULL}; + "gdev", "gmin", "tnom", + "simulatorVersion", "sourceScaleFactor", "initializeLimiting", + "epsmin", "reltol", "vntol", "abstol", + NULL}; char *sim_params_str[1] = {NULL}; -double sim_param_vals[NUM_SIM_PARAMS] = {0, 0, 0, 0, 0}; +double sim_param_vals[NUM_SIM_PARAMS] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; /* values returned by $simparam*/ OsdiSimParas get_simparams(const CKTcircuit *ckt) { @@ -37,8 +40,11 @@ OsdiSimParas get_simparams(const CKTcircuit *ckt) { double sourceScaleFactor = ckt->CKTsrcFact; double gmin = ((ckt->CKTgmin) > (ckt->CKTdiagGmin)) ? (ckt->CKTgmin) : (ckt->CKTdiagGmin); + double initializeLimiting = (ckt->CKTmode & MODEINITJCT) ? 1 : 0; + double sim_param_vals_[NUM_SIM_PARAMS] = { - gdev, gmin, ckt->CKTnomTemp, simulatorVersion, sourceScaleFactor}; + gdev, gmin, ckt->CKTnomTemp, simulatorVersion, sourceScaleFactor, initializeLimiting, + ckt->CKTepsmin, ckt->CKTreltol, ckt->CKTvoltTol, ckt->CKTabstol }; memcpy(&sim_param_vals, &sim_param_vals_, sizeof(double) * NUM_SIM_PARAMS); OsdiSimParas sim_params_ = {.names = sim_params, .vals = (double *)&sim_param_vals, From b8020b99adb236a9498d4c19e3477fdddba8cad0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81rp=C3=A1d=20B=C5=B1rmen?= Date: Tue, 3 Dec 2024 15:21:08 +0100 Subject: [PATCH 2/3] Verilog-A $simparam("tnom") is in degrees Celsius. Adjusted OSDI interfaces to reflect that. --- src/osdi/osdiload.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/osdi/osdiload.c b/src/osdi/osdiload.c index c07bb377a..a36673d62 100644 --- a/src/osdi/osdiload.c +++ b/src/osdi/osdiload.c @@ -43,7 +43,8 @@ OsdiSimParas get_simparams(const CKTcircuit *ckt) { double initializeLimiting = (ckt->CKTmode & MODEINITJCT) ? 1 : 0; double sim_param_vals_[NUM_SIM_PARAMS] = { - gdev, gmin, ckt->CKTnomTemp, simulatorVersion, sourceScaleFactor, initializeLimiting, + // Verilog-A tnom is in degrees Celsius + gdev, gmin, ckt->CKTnomTemp-CONSTCtoK, simulatorVersion, sourceScaleFactor, initializeLimiting, ckt->CKTepsmin, ckt->CKTreltol, ckt->CKTvoltTol, ckt->CKTabstol }; memcpy(&sim_param_vals, &sim_param_vals_, sizeof(double) * NUM_SIM_PARAMS); OsdiSimParas sim_params_ = {.names = sim_params, From d0576b6e03cc8c9f28335e193cbd8ed1f31d62d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81rp=C3=A1d=20B=C5=B1rmen?= Date: Wed, 4 Dec 2024 14:18:56 +0100 Subject: [PATCH 3/3] Fixed incorrect OSDItrunc() state index when $limit is present. --- src/osdi/osditrunc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/osdi/osditrunc.c b/src/osdi/osditrunc.c index e499b60d5..9cbb32ca8 100644 --- a/src/osdi/osditrunc.c +++ b/src/osdi/osditrunc.c @@ -30,7 +30,7 @@ int OSDItrunc(GENmodel *in_model, CKTcircuit *ckt, double *timestep) { } } - int state = inst->GENstate; + int state = inst->GENstate + (int)descr->num_states; for (uint32_t i = 0; i < descr->num_nodes; i++) { if (descr->nodes[i].react_residual_off != UINT32_MAX) { CKTterr(state, ckt, timestep);