25 return system(command_line);
70 int param_nr, highmarg, pseudomarg;
79 strcpy(errmsg,
"Can't write to the '");
81 strcat(errmsg,
"' file.\n");
93 paramvalue -=
delta[x];
95 paramvalue +=
delta[x];
96 fprintf(fp,
"param[%d] = %.6lf\n", x, paramvalue);
111 if((fp=fopen(logicfile,
"a"))==NULL)
113 printf(
"Cannot open file %s!\n\n", logicfile);
117 fprintf(fp,
"PARAMETER %d - %s:\n", param_nr,
names[param_nr-1]);
119 fprintf(fp,
"LOW MARGIN - ");
121 fprintf(fp,
"HIGH MARGIN - ");
123 fprintf(fp,
"POINT WITHIN OPERATING REGION\n\n");
125 fprintf(fp,
"OUTSIDE OPERATING REGION\n\n");
126 for(x=1; x<=
dim; x++)
131 paramvalue -=
delta[x];
133 paramvalue +=
delta[x];
134 fprintf(fp,
"param[%d] = %.6lf", x, paramvalue);
137 fprintf(fp,
"\t<= %6.2lf%s",
161 if(pm1->val > pm2->val)
164 if(pm1->val < pm2->val)
175 if((argc<3) || (argc>4))
184 if((argc==4) && (argv[2][0]!=
'-'))
186 if(strcmp(argv[1],
"-b")==0)
192 if(strcmp(argv[1],
"-2")==0)
198 if(strcmp(argv[1],
"-B")==0)
211 #define marg_main main 224 printf(
"\nSYNOPSIS:\n\n");
225 printf(
"\tmarg [-B|-b|-2] <circuit_name> <parameter_set_number>\n\n");
271 #define SCREEN_FILE_WRITE \ 272 printf("%s", outline); \ 273 fprintf(fp, "%s", outline); 290 if ((fp=fopen(outfile,
"w")) == NULL) {
291 strcpy(errmsg,
"Can't write to the '");
292 strcat(errmsg, outfile);
293 strcat(errmsg,
"' file.\n");
304 if ((fp=fopen(outfile,
"w")) == NULL) {
305 strcpy(errmsg,
"Can't write to the '");
306 strcat(errmsg, outfile);
307 strcat(errmsg,
"' file.\n");
316 printf(
"Margins calculated to within +/-%5.2f percent.\n",
param.
accuracy);
317 fprintf(fp,
"Margins calculated to within +/-%5.2f percent.\n",
param.
accuracy);
318 printf(
"Param: Margins: Percent:\n");
319 fprintf(fp,
"Param: Margins: Percent:\n");
321 for (x=1;
dim >= x; ++x) {
322 for (y=1;
dim >= y; ++y)
329 nrerror(
"parameter values failed");
332 sprintf(outline,
"%s\t%9.5f ...%9.5f ...",
338 margins[margcount].
val=
340 margins[margcount].
sgn=-1;
342 margins[margcount++].
pseudo=
353 nrerror(
"parameter values failed");
360 margins[margcount].
val=
362 margins[margcount].
sgn=+1;
364 margins[margcount++].
pseudo=
367 sprintf(outline,
"-%5.1f%s +%5.1f%s\t",
368 margins[margcount-2].val,
369 margins[margcount-2].pseudo?
"*":
" ",
370 margins[margcount-1].val,
371 margins[margcount-1].pseudo?
"*":
" " 375 sprintf(outline,
"\n");
384 printf(
"\n\nMost critical margins:\n\n");
385 fprintf(fp,
"\n\nMost critical margins:\n\n");
386 for(x=0; x<margcount; x++)
388 sprintf(outline,
"%d. %s\t=>\t%s%5.1f%s\n",
389 x+1,
names[margins[x].param_nr],
390 ((margins[x].sgn>0)?
"+":
"-"), margins[x].val,
391 (margins[x].pseudo?
"*":
" "));
char logic_ext[NAME_LENGTH]
char circuit_name[NAME_LENGTH]
SIGNALS * collect_pulses_by_phase(char *filename)
int change_into_logic(SIGNALS *sp)
char output_dir[NAME_LENGTH]
static int compute_boundary(FILE *fp)
int print_with_clk(SIGNALS *sp, FILE *fp)
int read_config(char *filename)
void nrerror(char *error_text)
#define COLLECT_BY_VOLTAGE
SIGNALS * collect_pulses_by_voltage(char *filename)
#define SCREEN_FILE_WRITE
char spice_name[NAME_LENGTH]
char opt_num[NAME_LENGTH]
double * vector(int nl, int nh)
int print_async_signals(SIGNALS *sp, FILE *fp)
char marg_ext[NAME_LENGTH]
int generate_jspice_config()
static int store_boundary_logic(int param_nr, int highmarg, int pseudomarg)
int pulse_extraction_method
static int run_boundary()
char(* names)[NAME_LENGTH]
char tmp_dir[NAME_LENGTH]
char bound_ext[NAME_LENGTH]
int marg_main(int argc, argv)
static int read_command_line(int argc, argv)
int addpoint(double *pc, double *po)
static char outline[LONG_LINE_LENGTH]
static int margcomp(MARGIN *pm1, MARGIN *pm2)
char nom_ext[NAME_LENGTH]
double ** matrix(int nrl, int nrh, int ncl, int nch)