57 static int do_it(
int,
int,
double,
double);
58 static int findext(
int,
double*,
double,
double);
63 static void modify(
double,
double);
64 static void setvec(
double,
double);
103 (void) fprintf(
cp_err,
"Error: no circuit loaded.\n");
107 (void) fprintf(
cp_err,
"Error: no bound codeblock.\n");
111 (void) fprintf(
cp_err,
"Error: codeblock %s not found.\n",
141 for (ww = wl; wl; wl = wn) {
143 if (wl->wl_word[0] ==
'-' && wl->wl_word[1] ==
'v') {
159 if (!wl || !wl->wl_word || *wl->wl_word ==
'\0') {
163 "Error: no or more than one analysis specified\n");
171 for (c = wl->wl_word; *c; c++)
172 if (isupper(*c)) *c = tolower(*c);
180 if (step1 || step2) {
182 (void) fprintf(
cp_err,
"Error: Can't open data output file\n");
189 (void) fprintf(
cp_err,
"Error: check variable checkPNTS not set\n");
219 "Operating range analysis complete. Data in file %s.\n",buf);
251 fprintf(
cp_err,
"Syntax error\n");
255 if (!wl || !wl->wl_word || *wl->wl_word ==
'\0') {
259 "Error: no or more than one analysis specified\n");
263 for (c = wl->wl_word; *c; c++)
264 if (isupper(*c)) *c = tolower(*c);
278 if ((loop.
step[i] > 0 && tt > 1
e-8) ||
279 (loop.
step[i] < 0 && tt < 1
e-8) ||
286 if (loop.
dims[2] <= 1) {
316 error =
if_run(wl->wl_word, wl->wl_next);
321 error = (*(
ft_sim->doAnalyses))
340 if (loop.
dims[2] > 1) {
382 loop->inprogress = 0;
386 line = (*wl)->wl_word;
389 loop->start[0] = tmp;
396 loop->stop[0] = loop->start[0];
406 loop->stop[0] = loop->start[0];
411 (*wl) = (*wl)->wl_next;
413 loop->step[0] = loop->stop[0] - loop->start[0];
417 line = (*wl)->wl_word;
422 loop->step[0] = loop->stop[0] - loop->start[0];
426 (*wl) = (*wl)->wl_next;
431 line = (*wl)->wl_word;
434 loop->start[1] = tmp;
440 (*wl) = (*wl)->wl_next;
442 loop->stop[1] = loop->start[1];
447 line = (*wl)->wl_word;
450 loop->start[1] = tmp;
452 loop->stop[1] = loop->start[1];
457 (*wl) = (*wl)->wl_next;
459 loop->step[1] = loop->stop[1] - loop->start[1];
463 line = (*wl)->wl_word;
466 loop->start[1] = tmp;
468 loop->step[1] = loop->stop[1] - loop->start[1];
471 (*wl) = (*wl)->wl_next;
485 char *filename =
NULL;
489 ShowPrompt(
"Exit sced to run operating range analysis.");
497 if (infile !=
NULL) {
500 if (wl && wl->wl_word && *wl->wl_word) {
501 filename = wl->wl_word;
507 if (!wl || !wl->wl_word || *wl->wl_word ==
'\0') {
511 filename = wl->wl_word;
513 if ((fp = fopen(filename,
"r")) ==
NULL) {
514 (void) fprintf(
cp_err,
"Error: can't open source file\n");
520 if (filename && *filename) {
521 cblock =
tmalloc(strlen(filename) + 3);
522 sprintf(cblock,
"#_%s",filename);
536 ww =
cp_lexer(
"set value1=0.0 value2=0.0");
582 "Substitution for value1:\n\ 585 steps: %d\n\n",val1,delta1,step1);
588 "Substitution for value2:\n\ 591 steps: %d\n\n",val2,delta2,step2);
593 out_printf(
"checkiterate is set to %d\n\n",iterno);
604 double value1, value2;
605 char *apology =
"Sorry, margin analysis can't be resumed in this version.\n";
642 (void) fprintf(
cp_out,
"%d %d %g %g\n",
646 (void) fprintf(
Op,
"%d %d %g %g\n",
657 "Warning: bad value for checkiterate, ignored.\n");
661 (void)
if_run(cmdwl->wl_word, cmdwl->wl_next);
664 (void) fprintf(
cp_err,apology);
669 (
void) fprintf(
cp_err,apology);
685 sprintf(buf,
"unlet oplo; let oplo[%d]=0",2*n);
687 sprintf(buf,
"unlet ophi; let ophi[%d]=0",2*n);
701 double value1, value2, delta;
702 char *flags, *rowflags;
705 if (cntrl->step1 == 0 && cntrl->step2 == 0) {
708 if (cntrl->iterno == 0)
713 "Error: central point bad, range not found.\n");
716 value2 = cntrl->val2;
717 value1 = cntrl->val1;
719 for (i = 0; i < 10; i++) {
722 do_it(0,0,value1,value2);
726 if (
findext(cntrl->iterno,&value1,value2,-delta))
734 (void) fprintf(
cp_err,
"Warning: could not find upper limit.\n");
738 value1 = cntrl->val1;
740 for (i = 0; i < 2; i++) {
743 do_it(0,0,value1,value2);
747 if (
findext(cntrl->iterno,&value1,value2,delta))
755 (void) fprintf(
cp_err,
"Warning: could not find lower limit.\n");
762 num1 = 2*cntrl->step1 + 1;
763 num2 = 2*cntrl->step2 + 1;
769 for (j = -cntrl->step2; j <= cntrl->
step2; j++) {
770 value2 = cntrl->val2 + j*cntrl->delta2;
772 rowflags = flags + (j + cntrl->step2)*num1;
773 for (last = i = -cntrl->step1; i <= cntrl->
step1; i++,rowflags++) {
774 if (*rowflags == 2)
continue;
775 if (*rowflags == 1)
break;
776 value1 = cntrl->val1 + i*cntrl->delta1;
777 *rowflags =
do_it(i,j,value1,value2);
783 if (!OUTcntrl->
out_fail && i != -cntrl->step1) {
784 if (
findext(cntrl->iterno,&value1,value2,cntrl->delta1))
790 rowflags = flags + (j + cntrl->step2 + 1)*num1 - 1;
791 for (i = cntrl->step1; i > last; i--,rowflags--) {
792 if (*rowflags == 2)
continue;
793 if (*rowflags == 1)
break;
794 value1 = cntrl->val1 + i*cntrl->delta1;
795 *rowflags =
do_it(i,j,value1,value2);
800 if (!OUTcntrl->
out_fail && i != cntrl->step1) {
801 if (
findext(cntrl->iterno,&value1,value2,-cntrl->delta1))
811 if (cntrl->step2 > 1) {
812 for (i = -cntrl->step1; i <= cntrl->
step1; i++) {
813 value1 = cntrl->val1 + i*cntrl->delta1;
815 rowflags = flags + i + cntrl->step1;
816 for (last = j = -cntrl->step2; j <= cntrl->
step2;
817 j++,rowflags += num1) {
818 if (*rowflags == 2)
continue;
819 if (*rowflags == 1)
break;
820 value2 = cntrl->val2 + j*cntrl->delta2;
821 *rowflags =
do_it(i,j,value1,value2);
828 rowflags = flags + i + cntrl->step1 + 2*cntrl->step2*num1;
829 for (j = cntrl->step2; j > last; j--,rowflags -= num1) {
830 if (*rowflags == 2)
continue;
831 if (*rowflags == 1)
break;
832 value2 = cntrl->val2 + j*cntrl->delta2;
833 *rowflags =
do_it(i,j,value1,value2);
852 double value1,value2;
859 (void) fprintf(
cp_out,
"%d %d %g %g\n",i,j,value1,value2);
861 (void) fprintf(
Op,
"%d %d %g %g\n",i,j,value1,value2);
885 double *value1,value2,delta;
932 (void) fprintf(
cp_out,OUTcntrl->
out_fail ?
" fail\n\n" :
" pass\n\n");
934 (void) fprintf(
Op,OUTcntrl->
out_fail ?
"\tfail\n" :
"\tpass\n");
954 if (
prefix(
".control",buf)) {
959 if (
prefix(
".endc",buf)) {
961 (void) fprintf(
cp_err,
"Warning: no .control line found\n");
965 *strchr(buf,
'\n') =
'\0';
1012 return ((
int) *d->
v_realdata ?
true :
false);
1022 FILE *lastin, *lastout, *lasterr;
1045 double value1,value2;
1050 sprintf(buf,
"set value1=%g value2=%g",value1,value2);
1063 struct dvec *
d, *n1, *n2;
1078 if (i < 0 || i >= len)
1084 if (i < 0 || i >= len)
1102 char buf[128], buf1[128], *
s;
1107 wl =
cp_lexer(
"set mplot_cur=mplot");
1117 if ((s = strrchr(buf,DIR_TERM)) !=
NULL)
1123 if ((s = strrchr(buf1,
'.')) !=
NULL)
1125 strcat(buf1,
".d00");
1126 s = strchr(buf1,
'.') + 2;
1127 for (i = 1; i < 100; i++) {
1128 if (
access(buf1,0))
break;
1130 *(s+1) = i%10 +
'0';
1134 fp = fopen(buf1,
"w");
1140 sprintf(buf,
"set mplot_cur=%s",buf1);
static char buf[MAXPROMPT]
void com_loop(wordlist *wl)
bool cp_getvar(char *n, int t, char *r)
struct plot * plot_alloc()
bool inp_spdeck(struct line *deck, char *filename)
static bool check_evaluate()
void ft_check(wordlist *wl, FILE *infile)
struct circ * ft_circuits
struct wordlist * wl_prev
wordlist * GetAnalysisFromDeck()
int access(char *pth, int m)
void com_check(wordlist *wl)
static bool read_check_control_file()
struct wordlist * wl_next
static struct sOUTcontrol * OUTcntrl
void ShowPrompt(char *str)