make accessible

This commit is contained in:
Pascal Kuthe 2023-05-02 23:32:22 +02:00
parent d4d576d695
commit c080f08044
No known key found for this signature in database
GPG Key ID: D715E8655AE166A6
3 changed files with 26 additions and 7 deletions

View File

@ -19,6 +19,7 @@ typedef struct OsdiRegistryEntry {
uint32_t inst_offset;
uint32_t dt;
uint32_t temp;
bool has_m;
} OsdiRegistryEntry;
typedef struct OsdiObjectFile {

View File

@ -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;
}

View File

@ -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,
};
}