From e5d1885e39bb190afed9c13c736b4f40f1e7d658 Mon Sep 17 00:00:00 2001 From: Pascal Kuthe Date: Tue, 2 May 2023 23:32:22 +0200 Subject: [PATCH] make accessible --- src/include/ngspice/osdiitf.h | 1 + src/osdi/osdiinit.c | 26 ++++++++++++++++++++------ src/osdi/osdiregistry.c | 6 +++++- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/include/ngspice/osdiitf.h b/src/include/ngspice/osdiitf.h index 5c84ed0ad..4f93d6c28 100644 --- a/src/include/ngspice/osdiitf.h +++ b/src/include/ngspice/osdiitf.h @@ -19,6 +19,7 @@ typedef struct OsdiRegistryEntry { uint32_t inst_offset; uint32_t dt; uint32_t temp; + bool has_m; } OsdiRegistryEntry; typedef struct OsdiObjectFile { diff --git a/src/osdi/osdiinit.c b/src/osdi/osdiinit.c index 7d83b5dfe..f74867d74 100644 --- a/src/osdi/osdiinit.c +++ b/src/osdi/osdiinit.c @@ -32,7 +32,7 @@ * descr->param_opvar to the internal ngspice representation (IFparm). */ static int write_param_info(IFparm **dst, const OsdiDescriptor *descr, - uint32_t start, uint32_t end) { + uint32_t start, uint32_t end, bool has_m) { for (uint32_t i = start; i < end; i++) { OsdiParamOpvar *para = &descr->param_opvar[i]; uint32_t num_names = para->num_alias + 1; @@ -68,12 +68,23 @@ static int write_param_info(IFparm **dst, const OsdiDescriptor *descr, dataType |= IF_UNINTERESTING; } char *para_name = copy(para->name[j]); + if (para_name[0] == '$') { + para_name[0] = '_'; + } strtolower(para_name); (*dst)[j] = (IFparm){.keyword = para_name, .id = (int)i, .description = para->description, .dataType = dataType}; } + if (!has_m && !strcmp(para->name[0], "$mfactor")) { + (*dst)[num_names] = (IFparm){.keyword = "m", + .id = (int)i, + .description = para->description, + .dataType = dataType}; + *dst += 1; + } + *dst += num_names; } @@ -110,6 +121,10 @@ extern SPICEdev *osdi_create_spicedev(const OsdiRegistryEntry *entry) { *num_instance_para_names += 1; } + if (!entry->has_m) { + *num_instance_para_names += 1; + } + IFparm *instance_para_names = TMALLOC(IFparm, *num_instance_para_names); IFparm *dst = instance_para_names; @@ -124,9 +139,9 @@ extern SPICEdev *osdi_create_spicedev(const OsdiRegistryEntry *entry) { "Instance temperature"}; dst += 1; } - write_param_info(&dst, descr, 0, descr->num_instance_params); + write_param_info(&dst, descr, 0, descr->num_instance_params, entry->has_m); write_param_info(&dst, descr, descr->num_params, - descr->num_params + descr->num_opvars); + descr->num_params + descr->num_opvars, true); // allocate and fill model params int *num_model_para_names = TMALLOC(int, 1); @@ -135,7 +150,8 @@ extern SPICEdev *osdi_create_spicedev(const OsdiRegistryEntry *entry) { } IFparm *model_para_names = TMALLOC(IFparm, *num_model_para_names); dst = model_para_names; - write_param_info(&dst, descr, descr->num_instance_params, descr->num_params); + write_param_info(&dst, descr, descr->num_instance_params, descr->num_params, + true); // Allocate SPICE device SPICEdev *OSDIinfo = TMALLOC(SPICEdev, 1); @@ -181,7 +197,5 @@ extern SPICEdev *osdi_create_spicedev(const OsdiRegistryEntry *entry) { OSDIinfo->DEVpzLoad = OSDIpzLoad; OSDIinfo->DEVtrunc = OSDItrunc; - - return OSDIinfo; } diff --git a/src/osdi/osdiregistry.c b/src/osdi/osdiregistry.c index e3362fa38..36d989b3e 100644 --- a/src/osdi/osdiregistry.c +++ b/src/osdi/osdiregistry.c @@ -358,12 +358,15 @@ extern OsdiObjectFile load_object_file(const char *input) { const OsdiDescriptor *descr = &OSDI_DESCRIPTORS[i]; uint32_t dt = descr->num_params + descr->num_opvars; + bool has_m = false; uint32_t temp = descr->num_params + descr->num_opvars + 1; for (uint32_t param_id = 0; param_id < descr->num_params; param_id++) { OsdiParamOpvar *param = &descr->param_opvar[param_id]; for (uint32_t j = 0; j < 1 + param->num_alias; j++) { char *name = param->name[j]; - if (!strcmp(name, "dt")) { + if (!strcmp(name, "m")) { + has_m = true; + } else if (!strcmp(name, "dt")) { dt = UINT32_MAX; } else if (!strcasecmp(name, "dtemp") || !strcasecmp(name, "dt")) { dt = param_id; @@ -382,6 +385,7 @@ extern OsdiObjectFile load_object_file(const char *input) { .inst_offset = (uint32_t)inst_off, .dt = dt, .temp = temp, + .has_m = has_m, }; }