new command 'alterparam', to be used in conjunction with 'mc_source'
add command 'alterparam paramname=pvalue' to change a global .param add command 'alterparam subcktname pname=vpval' to change a parameter inside of a subcircuit
This commit is contained in:
parent
5c3a6a3829
commit
7dd81327ec
|
|
@ -5,6 +5,7 @@ void com_showmod(wordlist *wl);
|
||||||
void com_show(wordlist *wl);
|
void com_show(wordlist *wl);
|
||||||
void com_alter(wordlist *wl);
|
void com_alter(wordlist *wl);
|
||||||
void com_altermod(wordlist *wl);
|
void com_altermod(wordlist *wl);
|
||||||
|
void com_alterparam(wordlist *wl);
|
||||||
void com_meas(wordlist *wl);
|
void com_meas(wordlist *wl);
|
||||||
void com_sysinfo(wordlist *wl);
|
void com_sysinfo(wordlist *wl);
|
||||||
void com_check_ifparm(wordlist *wl);
|
void com_check_ifparm(wordlist *wl);
|
||||||
|
|
|
||||||
|
|
@ -373,6 +373,10 @@ struct comm spcp_coms[] = {
|
||||||
{ 040, 040, 040, 040 }, E_DEFHMASK, 0, LOTS,
|
{ 040, 040, 040, 040 }, E_DEFHMASK, 0, LOTS,
|
||||||
NULL,
|
NULL,
|
||||||
"devspecs : parmname value : Alter model parameters." } ,
|
"devspecs : parmname value : Alter model parameters." } ,
|
||||||
|
{ "alterparam", com_alterparam, TRUE, FALSE,
|
||||||
|
{ 040, 040, 040, 040 }, E_DEFHMASK, 1, LOTS,
|
||||||
|
NULL,
|
||||||
|
"devspecs : parmname value : Alter .param parameters." },
|
||||||
{ "resume", com_resume, TRUE, FALSE,
|
{ "resume", com_resume, TRUE, FALSE,
|
||||||
{ 0, 0, 0, 0 }, E_DEFHMASK, 0, 0,
|
{ 0, 0, 0, 0 }, E_DEFHMASK, 0, 0,
|
||||||
NULL,
|
NULL,
|
||||||
|
|
|
||||||
|
|
@ -1204,6 +1204,139 @@ com_edit(wordlist *wl)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* alter a parameter, either
|
||||||
|
subckt param: alterparam subcktname pname=vpval
|
||||||
|
global .param: alterparam pname=pval
|
||||||
|
Changes params in mc_deck
|
||||||
|
To become effective, 'mc_source' has to be called after 'alterparam' */
|
||||||
|
void
|
||||||
|
com_alterparam(wordlist *wl)
|
||||||
|
{
|
||||||
|
struct card *dd;
|
||||||
|
char *pname, *pval, *tmp, *subcktname = NULL, *linein, *linefree, *s;
|
||||||
|
bool found = FALSE;
|
||||||
|
|
||||||
|
if (!mc_deck) {
|
||||||
|
fprintf(cp_err, "Error: No internal deck available\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
linefree = wl_flatten(wl);
|
||||||
|
linein = skip_ws(linefree);
|
||||||
|
s = tmp = gettok_char(&linein, '=', FALSE, FALSE);
|
||||||
|
if (!s) {
|
||||||
|
fprintf(cp_err, "\nError: Wrong format in line 'alterparam %s'\n command 'alterparam' skipped\n", linefree);
|
||||||
|
tfree(linefree);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
linein++; /* skip the '=' */
|
||||||
|
pval = gettok(&linein);
|
||||||
|
subcktname = gettok(&tmp);
|
||||||
|
if (!pval || !subcktname) {
|
||||||
|
fprintf(cp_err, "\nError: Wrong format in line 'alterparam %s'\n command 'alterparam' skipped\n", linefree);
|
||||||
|
tfree(pval);
|
||||||
|
tfree(subcktname);
|
||||||
|
tfree(linefree);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pname = gettok(&tmp);
|
||||||
|
if (!pname) {
|
||||||
|
pname = subcktname;
|
||||||
|
subcktname = NULL;
|
||||||
|
}
|
||||||
|
tfree(linefree);
|
||||||
|
tfree(s);
|
||||||
|
for (dd = mc_deck->nextcard; dd; dd = dd->nextcard) {
|
||||||
|
char *curr_line = dd->line;
|
||||||
|
/* alterparam subcktname pname=vpval
|
||||||
|
Parameters from within subcircuit are no longer .param lines, but have been added to
|
||||||
|
the .subckt line as pname=paval and to the x line as pval. pval in the x line takes
|
||||||
|
precedence when subciruit is called, so has to be replaced here.
|
||||||
|
Find subcircuit with subcktname.
|
||||||
|
After params: Count the number of parameters (notok) until parameter pname is found.
|
||||||
|
When found, search for x-line with subcktname.
|
||||||
|
Replace parameter value number notok by pval.
|
||||||
|
*/
|
||||||
|
if (subcktname) {
|
||||||
|
/* find subcircuit */
|
||||||
|
if (ciprefix(".subckt", curr_line)) {
|
||||||
|
curr_line = nexttok(curr_line); /* skip .subckt */
|
||||||
|
char *sname = gettok(&curr_line);
|
||||||
|
if (eq(sname, subcktname)) {
|
||||||
|
tfree(sname);
|
||||||
|
curr_line = strstr(curr_line, "params:");
|
||||||
|
curr_line = skip_non_ws(curr_line); /* skip params: */
|
||||||
|
/* string to search for */
|
||||||
|
char *pname_eq = tprintf("%s=", pname);
|
||||||
|
int notok = 0;
|
||||||
|
while (*curr_line) {
|
||||||
|
char *token = gettok(&curr_line);
|
||||||
|
if (ciprefix(pname_eq, token)) {
|
||||||
|
tfree(token);
|
||||||
|
found = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
notok++;
|
||||||
|
tfree(token);
|
||||||
|
}
|
||||||
|
tfree(pname_eq);
|
||||||
|
if (found) {
|
||||||
|
/* find x line with same subcircuit name */
|
||||||
|
struct card *xx;
|
||||||
|
char *bsubb = tprintf(" %s ", subcktname);
|
||||||
|
for (xx = mc_deck->nextcard; xx; xx = xx->nextcard) {
|
||||||
|
char *xline = xx->line;
|
||||||
|
if (*xline == 'x') {
|
||||||
|
xline = strstr(xline, bsubb);
|
||||||
|
if (xline) {
|
||||||
|
xline = nexttok(xline); /* skip subcktname */
|
||||||
|
int ii;
|
||||||
|
for (ii = 0; ii < notok; ii++)
|
||||||
|
xline = nexttok(xline); /* skip parameter values */
|
||||||
|
char *beg = copy_substring(xx->line, xline);
|
||||||
|
xline = nexttok(xline); /* skip parameter value to be replaced */
|
||||||
|
char *newline = tprintf("%s %s %s", beg, pval, xline);
|
||||||
|
tfree(xx->line);
|
||||||
|
xx->line = newline;
|
||||||
|
tfree(beg);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tfree(bsubb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
tfree(sname);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} /* subcktname */
|
||||||
|
/* alterparam pname=vpval */
|
||||||
|
else {
|
||||||
|
if (ciprefix(".para", curr_line)) {
|
||||||
|
curr_line = nexttok(curr_line); /* skip .param */
|
||||||
|
char *name = gettok_char(&curr_line, '=', FALSE, FALSE);
|
||||||
|
if (eq(name, pname)) {
|
||||||
|
curr_line = dd->line;
|
||||||
|
char *start = gettok_char(&curr_line, '=', TRUE, FALSE);
|
||||||
|
tfree(dd->line);
|
||||||
|
dd->line = tprintf("%s%s", start, pval);
|
||||||
|
found = TRUE;
|
||||||
|
tfree(start);
|
||||||
|
}
|
||||||
|
tfree(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found)
|
||||||
|
fprintf(cp_err, "\nError: parameter '%s' not found,\n command 'alterparam' skipped\n", pname);
|
||||||
|
tfree(pval);
|
||||||
|
tfree(pname);
|
||||||
|
tfree(subcktname);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
doedit(char *filename)
|
doedit(char *filename)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue