feat: update to newest OSDI header

This commit is contained in:
DSPOM 2022-05-16 20:35:13 +02:00
parent 016b896fa9
commit f582a8ff10
3 changed files with 48 additions and 35 deletions

View File

@ -25,6 +25,11 @@
#define ACCESS_FLAG_SET 1 #define ACCESS_FLAG_SET 1
#define ACCESS_FLAG_INSTANCE 4 #define ACCESS_FLAG_INSTANCE 4
#define JACOBIAN_ENTRY_RESIST_CONST 1
#define JACOBIAN_ENTRY_REACT_CONST 2
#define JACOBIAN_ENTRY_RESIST 4
#define JACOBIAN_ENTRY_REACT 8
#define CALC_RESIST_RESIDUAL 1 #define CALC_RESIST_RESIDUAL 1
#define CALC_REACT_RESIDUAL 2 #define CALC_REACT_RESIDUAL 2
#define CALC_RESIST_JACOBIAN 4 #define CALC_RESIST_JACOBIAN 4
@ -74,11 +79,19 @@ typedef struct OsdiNodePair {
uint32_t node_2; uint32_t node_2;
}OsdiNodePair; }OsdiNodePair;
typedef struct OsdiJacobianEntry {
OsdiNodePair nodes;
uint32_t react_ptr_off;
uint32_t flags;
}OsdiJacobianEntry;
typedef struct OsdiNode { typedef struct OsdiNode {
char *name; char *name;
bool is_reactive;
char *units; char *units;
char *residual_units; char *residual_units;
uint32_t resist_residual_off;
uint32_t react_residual_off;
bool is_flow;
}OsdiNode; }OsdiNode;
typedef struct OsdiParamOpvar { typedef struct OsdiParamOpvar {
@ -103,12 +116,11 @@ typedef struct OsdiDescriptor {
OsdiNode *nodes; OsdiNode *nodes;
uint32_t num_jacobian_entries; uint32_t num_jacobian_entries;
OsdiNodePair *jacobian_entries; OsdiJacobianEntry *jacobian_entries;
bool *const_jacobian_entries;
uint32_t num_collapsible; uint32_t num_collapsible;
OsdiNodePair *collapsible; OsdiNodePair *collapsible;
size_t collapsed_offset; uint32_t collapsed_offset;
OsdiNoiseSource *noise_sources; OsdiNoiseSource *noise_sources;
uint32_t num_noise_src; uint32_t num_noise_src;
@ -118,14 +130,11 @@ typedef struct OsdiDescriptor {
uint32_t num_opvars; uint32_t num_opvars;
OsdiParamOpvar *param_opvar; OsdiParamOpvar *param_opvar;
size_t residual_resist_offset; uint32_t node_mapping_offset;
size_t residual_react_offset; uint32_t jacobian_ptr_resist_offset;
size_t node_mapping_offset;
size_t jacobian_ptr_resist_offset;
size_t jacobian_ptr_react_offset;
size_t instance_size; uint32_t instance_size;
size_t model_size; uint32_t model_size;
void *(*access)(void *inst, void *model, uint32_t id, uint32_t flags); void *(*access)(void *inst, void *model, uint32_t id, uint32_t flags);

View File

@ -136,17 +136,18 @@ extern int OSDIload(GENmodel *inModel, CKTcircuit *ckt) {
uint32_t *node_mapping = uint32_t *node_mapping =
(uint32_t *)(((char *)inst) + descr->node_mapping_offset); (uint32_t *)(((char *)inst) + descr->node_mapping_offset);
double *residual_react =
(double *)(((char *)inst) + descr->residual_react_offset);
/* use numeric integration to obtain the remainer of the RHS*/ /* use numeric integration to obtain the remainer of the RHS*/
int state = gen_inst->GENstate; int state = gen_inst->GENstate;
for (uint32_t i = 0; i < descr->num_nodes; i++) { for (uint32_t i = 0; i < descr->num_nodes; i++) {
if (descr->nodes[i].is_reactive) { if (descr->nodes[i].react_residual_off != UINT32_MAX) {
double residual_react = *((
double *)(((char *)inst) + descr->nodes[i].react_residual_off));
/* store charges in state vector*/ /* store charges in state vector*/
ckt->CKTstate0[state] = residual_react[i]; ckt->CKTstate0[state] = residual_react;
if (is_init_tran) { if (is_init_tran) {
ckt->CKTstate1[state] = residual_react[i]; ckt->CKTstate1[state] = residual_react;
} }
/* we only care about the numeric integration itself not ceq/geq /* we only care about the numeric integration itself not ceq/geq

View File

@ -26,7 +26,6 @@ static int handle_init_info(OsdiInitInfo info, const OsdiDescriptor *descr) {
return (OK); return (OK);
} }
for (uint32_t i = 0; i < info.num_errors; i++) { for (uint32_t i = 0; i < info.num_errors; i++) {
OsdiInitError *err = &info.errors[i]; OsdiInitError *err = &info.errors[i];
switch (err->code) { switch (err->code) {
@ -90,19 +89,19 @@ static uint32_t collapse_nodes(const OsdiDescriptor *descr, void *inst,
/* terminals created by the simulator cannot be collapsed /* terminals created by the simulator cannot be collapsed
*/ */
if (node_mapping[from] < connected_terminals && if (node_mapping[from] < connected_terminals &&
(to == descr->num_nodes || node_mapping[to] < connected_terminals || (to == UINT32_MAX || node_mapping[to] < connected_terminals ||
node_mapping[to] == descr->num_nodes)) { node_mapping[to] == UINT32_MAX)) {
continue; continue;
} }
/* ensure that to is always the smaller node */ /* ensure that to is always the smaller node */
if (to != descr->num_nodes && node_mapping[from] < node_mapping[to]) { if (to != UINT32_MAX && node_mapping[from] < node_mapping[to]) {
uint32_t temp = from; uint32_t temp = from;
from = to; from = to;
to = temp; to = temp;
} }
from = node_mapping[from]; from = node_mapping[from];
if (to != descr->num_nodes) { if (to != UINT32_MAX) {
to = node_mapping[to]; to = node_mapping[to];
} }
@ -110,10 +109,8 @@ static uint32_t collapse_nodes(const OsdiDescriptor *descr, void *inst,
for (uint32_t j = 0; j < descr->num_nodes; j++) { for (uint32_t j = 0; j < descr->num_nodes; j++) {
if (node_mapping[j] == from) { if (node_mapping[j] == from) {
node_mapping[j] = to; node_mapping[j] = to;
} else if (node_mapping[j] > from) { } else if (node_mapping[j] > from && node_mapping[j] != UINT32_MAX) {
if (node_mapping[j]!= num_nodes){ node_mapping[j] -= 1;
node_mapping[j] -= 1;
}
} }
} }
num_nodes -= 1; num_nodes -= 1;
@ -128,7 +125,7 @@ static void write_node_mapping(const OsdiDescriptor *descr, void *inst,
uint32_t *node_mapping = uint32_t *node_mapping =
(uint32_t *)(((char *)inst) + descr->node_mapping_offset); (uint32_t *)(((char *)inst) + descr->node_mapping_offset);
for (uint32_t i = 0; i < descr->num_nodes; i++) { for (uint32_t i = 0; i < descr->num_nodes; i++) {
if (node_mapping[i] == descr->num_nodes) { if (node_mapping[i] == UINT32_MAX) {
/* gnd node */ /* gnd node */
node_mapping[i] = 0; node_mapping[i] = 0;
} else { } else {
@ -145,12 +142,9 @@ static int init_matrix(SMPmatrix *matrix, const OsdiDescriptor *descr,
double **jacobian_ptr_resist = double **jacobian_ptr_resist =
(double **)(((char *)inst) + descr->jacobian_ptr_resist_offset); (double **)(((char *)inst) + descr->jacobian_ptr_resist_offset);
double **jacobian_ptr_react =
(double **)(((char *)inst) + descr->jacobian_ptr_react_offset);
for (uint32_t i = 0; i < descr->num_jacobian_entries; i++) { for (uint32_t i = 0; i < descr->num_jacobian_entries; i++) {
uint32_t equation = descr->jacobian_entries[i].node_1; uint32_t equation = descr->jacobian_entries[i].nodes.node_1;
uint32_t unkown = descr->jacobian_entries[i].node_2; uint32_t unkown = descr->jacobian_entries[i].nodes.node_2;
equation = node_mapping[equation]; equation = node_mapping[equation];
unkown = node_mapping[unkown]; unkown = node_mapping[unkown];
double *ptr = SMPmakeElt(matrix, (int)equation, (int)unkown); double *ptr = SMPmakeElt(matrix, (int)equation, (int)unkown);
@ -159,8 +153,13 @@ static int init_matrix(SMPmatrix *matrix, const OsdiDescriptor *descr,
return (E_NOMEM); return (E_NOMEM);
} }
jacobian_ptr_resist[i] = ptr; jacobian_ptr_resist[i] = ptr;
uint32_t react_off = descr->jacobian_entries[i].react_ptr_off;
// complex number for ac analysis // complex number for ac analysis
jacobian_ptr_react[i] = ptr + 1; if (react_off != UINT32_MAX) {
double **jacobian_ptr_react = (double **)(((char *)inst) + react_off);
*jacobian_ptr_react = ptr + 1;
}
} }
return (OK); return (OK);
} }
@ -187,7 +186,7 @@ int OSDIsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt,
/* determine the number of states required by each instance */ /* determine the number of states required by each instance */
int num_states = 0; int num_states = 0;
for (uint32_t i = 0; i < descr->num_nodes; i++) { for (uint32_t i = 0; i < descr->num_nodes; i++) {
if (descr->nodes[i].is_reactive) { if (descr->nodes[i].react_residual_off != UINT32_MAX) {
num_states += 2; num_states += 2;
} }
} }
@ -252,7 +251,11 @@ int OSDIsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt,
/* create internal nodes as required */ /* create internal nodes as required */
for (uint32_t i = connected_terminals; i < num_nodes; i++) { for (uint32_t i = connected_terminals; i < num_nodes; i++) {
// TODO handle currents correctly // TODO handle currents correctly
error = CKTmkVolt(ckt, &tmp, gen_inst->GENname, descr->nodes[i].name); if (descr->nodes[i].is_flow) {
error = CKTmkCur(ckt, &tmp, gen_inst->GENname, descr->nodes[i].name);
} else {
error = CKTmkVolt(ckt, &tmp, gen_inst->GENname, descr->nodes[i].name);
}
if (error) if (error)
return (error); return (error);
node_ids[i] = (uint32_t)tmp->number; node_ids[i] = (uint32_t)tmp->number;