malt-wr
margins.c File Reference
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "constype.h"
#include "filenames.h"
#include "init.h"
#include "qnrutil.h"
#include "collect.h"
#include "result.h"
#include "points.h"
Include dependency graph for margins.c:

Go to the source code of this file.

Macros

#define SCREEN_FILE_WRITE
 

Functions

static int run_boundary ()
 
static int compute_boundary (FILE *fp)
 
static int store_boundary_logic (int param_nr, int highmarg, int pseudomarg)
 
static int margcomp (MARGIN *pm1, MARGIN *pm2)
 
static int read_command_line (int argc, argv)
 
int marg_main (int argc, argv)
 
int compute_margins ()
 

Macro Definition Documentation

#define SCREEN_FILE_WRITE
Value:
printf("%s", outline); \
fprintf(fp, "%s", outline);
static char outline[LONG_LINE_LENGTH]
Definition: optimize.c:39

Function Documentation

static int compute_boundary ( FILE *  fp)
static

Definition at line 29 of file margins.c.

31 {
32  SIGNALS *sp;
33  char inputfile[NAME_LENGTH];
34 
35  strcpy(inputfile, param.tmp_dir);
36  strcat(inputfile, param.circuit_name);
37  strcat(inputfile, param.nom_ext);
38 
39 
41  {
42  case COLLECT_BY_PHASE:
43  sp=collect_pulses_by_phase(inputfile);
44  break;
45 
46  case COLLECT_BY_VOLTAGE:
47  sp=collect_pulses_by_voltage(inputfile);
48  break;
49  }
50 
51  if(sp!=NULL)
52  {
53  if(sp->clk_num>0)
54  {
56  print_with_clk(sp, fp);
57  }
58  else
59  print_async_signals(sp, fp);
60  }
61  else
62  return 0;
63 
64  return 1;
65 }
char circuit_name[NAME_LENGTH]
Definition: constype.h:184
SIGNALS * collect_pulses_by_phase(char *filename)
Definition: collect.c:750
int change_into_logic(SIGNALS *sp)
Definition: timelogic.c:8
int print_with_clk(SIGNALS *sp, FILE *fp)
Definition: result.c:155
#define COLLECT_BY_PHASE
Definition: constype.h:44
PARAMETERS param
Definition: init.c:10
#define COLLECT_BY_VOLTAGE
Definition: constype.h:45
SIGNALS * collect_pulses_by_voltage(char *filename)
Definition: collect.c:732
#define NAME_LENGTH
Definition: constype.h:3
int clk_num
Definition: constype.h:369
int print_async_signals(SIGNALS *sp, FILE *fp)
Definition: result.c:254
int pulse_extraction_method
Definition: constype.h:78
char tmp_dir[NAME_LENGTH]
Definition: constype.h:146
char nom_ext[NAME_LENGTH]
Definition: constype.h:174
int compute_margins ( )

Definition at line 257 of file margins.c.

258 {
259  FILE *fp;
260  char outfile[LINE_LENGTH];
261  char errmsg[LINE_LENGTH];
263  int x, y;
264 
265  MARGIN *margins;
266  int margcount=0;
267  double *pc, *po;
268 
269 
270 
271 #define SCREEN_FILE_WRITE \
272  printf("%s", outline); \
273  fprintf(fp, "%s", outline);
274 
275 
276  pc=vector(1,dim);
277  po=vector(0,dim);
278  hullpnts = matrix(1,dim*2,0,dim);
279  margins = (MARGIN*)calloc(2*dim, sizeof(MARGIN));
280 
281 
282  if(param.input_options & B_SET) {
283  /* reset file with the description of circuit behavior
284  at parameter region boundaries */
285  strcpy(outfile, param.output_dir);
286  strcat(outfile, param.circuit_name);
287  strcat(outfile, param.bound_ext);
288  strcat(outfile, param.logic_ext);
289  strcat(outfile, param.opt_num);
290  if ((fp=fopen(outfile,"w")) == NULL) {
291  strcpy(errmsg, "Can't write to the '");
292  strcat(errmsg, outfile);
293  strcat(errmsg, "' file.\n");
294  nrerror(errmsg);
295  }
296  fclose(fp);
297  }
298 
299  strcpy(outfile, param.output_dir);
300  strcat(outfile, param.circuit_name);
301  strcat(outfile, param.marg_ext);
302  strcat(outfile, param.opt_num);
303 
304  if ((fp=fopen(outfile,"w")) == NULL) {
305  strcpy(errmsg, "Can't write to the '");
306  strcat(errmsg, outfile);
307  strcat(errmsg, "' file.\n");
308  nrerror(errmsg);
309  }
310 
311 
312 /* find initial dim*2 points, print margins */
313 /* turn the margins into points, print margins */
314  sprintf(outline, "CIRCUIT NAME:\t%s\n\n", param.circuit_name);
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");
320 
321  for (x=1; dim >= x; ++x) {
322  for (y=1; dim >= y; ++y)
323  pc[y]=po[y]=centerpnt[y];
324 
325  pc[x]=centerpnt[x];
326  po[x]=lower[x];
327 
328  if (!addpoint(pc,po))
329  nrerror("parameter values failed");
330 
331  else {
332  sprintf(outline, "%s\t%9.5f ...%9.5f ...",
333  names[x-1],
334  hullpnts[pntcount][x]*scale[x],
335  centerpnt[x]*scale[x]);
337 
338  margins[margcount].val=
339  100.0*(centerpnt[x]-hullpnts[pntcount][x])/centerpnt[x];
340  margins[margcount].sgn=-1;
341  margins[margcount].param_nr=x-1;
342  margins[margcount++].pseudo=
343  (hullpnts[pntcount][x]==lower[x])?1:0;
344 
346  store_boundary_logic(x, 0, margins[margcount-1].pseudo);
347  }
348 
349  pc[x]=centerpnt[x];
350  po[x]=upper[x];
351 
352  if (!addpoint(pc,po))
353  nrerror("parameter values failed");
354 
355  else {
356  sprintf(outline,
357  "%9.5f ", hullpnts[pntcount][x]*scale[x]);
359 
360  margins[margcount].val=
361  100.0*(hullpnts[pntcount][x]-centerpnt[x])/centerpnt[x];
362  margins[margcount].sgn=+1;
363  margins[margcount].param_nr=x-1;
364  margins[margcount++].pseudo=
365  (hullpnts[pntcount][x]==upper[x])?1:0;
366 
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?"*":" "
372  );
374 
375  sprintf(outline, "\n");
377 
379  store_boundary_logic(x, 1, margins[margcount-1].pseudo);
380  }
381  }
382 
383  qsort(margins, margcount, sizeof(MARGIN), (int (*)())margcomp);
384  printf("\n\nMost critical margins:\n\n");
385  fprintf(fp,"\n\nMost critical margins:\n\n");
386  for(x=0; x<margcount; x++)
387  {
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?"*":" "));
393 
394  if(x==4) {
395  printf("\n");
396  fprintf(fp,"\n");
397  }
398  }
399 }
char logic_ext[NAME_LENGTH]
Definition: constype.h:168
double * scale
Definition: points.c:14
char circuit_name[NAME_LENGTH]
Definition: constype.h:184
char output_dir[NAME_LENGTH]
Definition: constype.h:149
int input_options
Definition: constype.h:199
#define LONG_LINE_LENGTH
Definition: constype.h:5
int dim
Definition: points.c:11
TIME accuracy
Definition: constype.h:122
int pntcount
Definition: points.c:12
PARAMETERS param
Definition: init.c:10
double ** hullpnts
Definition: points.c:14
void nrerror(char *error_text)
Definition: lineread.c:7
#define SCREEN_FILE_WRITE
double * lower
Definition: points.c:14
char opt_num[NAME_LENGTH]
Definition: constype.h:196
double * vector(int nl, int nh)
Definition: qnrutil.c:16
int sgn
Definition: constype.h:525
double * upper
Definition: points.c:14
double * centerpnt
Definition: points.c:14
char marg_ext[NAME_LENGTH]
Definition: constype.h:176
#define LINE_LENGTH
Definition: constype.h:4
static int store_boundary_logic(int param_nr, int highmarg, int pseudomarg)
Definition: margins.c:69
int param_nr
Definition: constype.h:526
char(* names)[NAME_LENGTH]
Definition: points.c:15
int pseudo
Definition: constype.h:527
#define B_SET
Definition: constype.h:26
char bound_ext[NAME_LENGTH]
Definition: constype.h:178
double val
Definition: constype.h:524
int addpoint(double *pc, double *po)
Definition: points.c:40
static char outline[LONG_LINE_LENGTH]
Definition: optimize.c:39
static int margcomp(MARGIN *pm1, MARGIN *pm2)
Definition: margins.c:158
double ** matrix(int nrl, int nrh, int ncl, int nch)
Definition: qnrutil.c:40
int marg_main ( int  argc,
argv   
)

Definition at line 214 of file margins.c.

217 {
218 /* load filename variables and stuff (Kris') */
219 
220  init_parameters();
221 
222  if(!read_command_line(argc, argv))
223  {
224  printf("\nSYNOPSIS:\n\n");
225  printf("\tmarg [-B|-b|-2] <circuit_name> <parameter_set_number>\n\n");
226  exit(255);
227  }
228 
230  exit(255);
231 
232 /* read name of the circuit */
233  strncpy(param.circuit_name, argv[argc-2], NAME_LENGTH);
234 
235 /* read name of input number */
236  strncpy(param.opt_num, argv[argc-1], NAME_LENGTH);
237 
239  strcat(param.spice_name, " -b ");
240 
241 
243 
245 
246 /* read input file, create and initialize global arrays */
247  readinit();
248 
250  get_regions();
251  else
252  compute_margins();
253  return (0);
254 }
char circuit_name[NAME_LENGTH]
Definition: constype.h:184
int compute_margins()
Definition: margins.c:257
#define BATCH_SET
Definition: constype.h:35
int input_options
Definition: constype.h:199
int read_config(char *filename)
Definition: init.c:189
#define TWO_SET
Definition: constype.h:27
PARAMETERS param
Definition: init.c:10
#define NAME_LENGTH
Definition: constype.h:3
void readinit(void)
Definition: points.c:159
char spice_name[NAME_LENGTH]
Definition: constype.h:152
char opt_num[NAME_LENGTH]
Definition: constype.h:196
int program
Definition: constype.h:193
int generate_jspice_config()
Definition: init.c:967
#define MARG_PROGRAM
Definition: constype.h:245
int get_regions()
Definition: region.c:255
#define INIT_CONFIG_FILE
Definition: filenames.h:4
static int read_command_line(int argc, argv)
Definition: margins.c:171
void init_parameters()
Definition: init.c:39
static int margcomp ( MARGIN pm1,
MARGIN pm2 
)
static

Definition at line 158 of file margins.c.

160 {
161  if(pm1->val > pm2->val)
162  return 1;
163  else
164  if(pm1->val < pm2->val)
165  return -1;
166  else
167  return 0;
168 }
double val
Definition: constype.h:524
static int read_command_line ( int  argc,
argv   
)
static

Definition at line 171 of file margins.c.

174 {
175  if((argc<3) || (argc>4))
176  return 0;
177 
178  if(argc==3)
179  if(argv[1][0]!='-')
180  return 1;
181  else
182  return 0;
183 
184  if((argc==4) && (argv[2][0]!='-'))
185  {
186  if(strcmp(argv[1], "-b")==0)
187  {
189  return 1;
190  }
191  else
192  if(strcmp(argv[1], "-2")==0)
193  {
195  return 1;
196  }
197  else
198  if(strcmp(argv[1], "-B")==0)
199  {
201  return 1;
202  }
203  else
204  return 0;
205  }
206  else
207  return 0;
208 }
#define BATCH_SET
Definition: constype.h:35
int input_options
Definition: constype.h:199
#define TWO_SET
Definition: constype.h:27
PARAMETERS param
Definition: init.c:10
#define B_SET
Definition: constype.h:26
static int run_boundary ( )
static

Definition at line 18 of file margins.c.

19 {
20  char command_line[LINE_LENGTH];
21 
22  strcpy(command_line, param.spice_name);
23  strcat(command_line, MARGINS_CALL);
24 
25  return system(command_line);
26 }
#define MARGINS_CALL
Definition: filenames.h:26
PARAMETERS param
Definition: init.c:10
char spice_name[NAME_LENGTH]
Definition: constype.h:152
#define LINE_LENGTH
Definition: constype.h:4
static int store_boundary_logic ( int  param_nr,
int  highmarg,
int  pseudomarg 
)
static

Definition at line 69 of file margins.c.

71 {
72  FILE *fp;
73  double paramvalue;
74  int i, x;
75 
76  char logicfile[LINE_LENGTH];
77  char errmsg[LINE_LENGTH];
78 
79  strcpy(errmsg, "Can't write to the '");
80  strcat(errmsg, PARAM_FILE);
81  strcat(errmsg, "' file.\n");
82 
83  for(i=0; i<2; i++)
84  {
85  if((fp=fopen(PARAM_FILE,"w")) == NULL)
86  nrerror(errmsg);
87 
88  for(x=1; x<=dim; x++)
89  {
90  paramvalue = hullpnts[pntcount][x]*scale[x];
91  if(!pseudomarg)
92  if(!i)
93  paramvalue -= delta[x];
94  else
95  paramvalue += delta[x];
96  fprintf(fp, "param[%d] = %.6lf\n", x, paramvalue);
97  }
98  fprintf(fp, "set circuit = '%s'\n", param.circuit_name);
99  fprintf(fp, "set opt_num = '%s'\n", param.opt_num);
100 
101  fclose(fp);
102 
103  run_boundary();
104 
105  strcpy(logicfile, param.output_dir);
106  strcat(logicfile, param.circuit_name);
107  strcat(logicfile, param.bound_ext);
108  strcat(logicfile, param.logic_ext);
109  strcat(logicfile, param.opt_num);
110 
111  if((fp=fopen(logicfile, "a"))==NULL)
112  {
113  printf("Cannot open file %s!\n\n", logicfile);
114  return 0;
115  }
116 
117  fprintf(fp, "PARAMETER %d - %s:\n", param_nr, names[param_nr-1]);
118  if(!highmarg)
119  fprintf(fp, "LOW MARGIN - ");
120  else
121  fprintf(fp, "HIGH MARGIN - ");
122  if(!i || pseudomarg)
123  fprintf(fp, "POINT WITHIN OPERATING REGION\n\n");
124  else
125  fprintf(fp, "OUTSIDE OPERATING REGION\n\n");
126  for(x=1; x<=dim; x++)
127  {
128  paramvalue = hullpnts[pntcount][x]*scale[x];
129  if(!pseudomarg)
130  if(!i)
131  paramvalue -= delta[x];
132  else
133  paramvalue += delta[x];
134  fprintf(fp, "param[%d] = %.6lf", x, paramvalue);
135  if(x==param_nr)
136  {
137  fprintf(fp, "\t<= %6.2lf%s",
138  100*(paramvalue/scale[x] - centerpnt[x])/centerpnt[x],
139  "%");
140  if(pseudomarg)
141  fprintf(fp, "*");
142  }
143  fprintf(fp, "\n");
144  }
145  fprintf(fp, "\n\n");
146 
147  compute_boundary(fp);
148  fprintf(fp, "\n\n");
149  fclose(fp);
150  if(pseudomarg)
151  break;
152  }
153 }
char logic_ext[NAME_LENGTH]
Definition: constype.h:168
double * scale
Definition: points.c:14
char circuit_name[NAME_LENGTH]
Definition: constype.h:184
char output_dir[NAME_LENGTH]
Definition: constype.h:149
static int compute_boundary(FILE *fp)
Definition: margins.c:29
int dim
Definition: points.c:11
int pntcount
Definition: points.c:12
PARAMETERS param
Definition: init.c:10
double ** hullpnts
Definition: points.c:14
double * delta
Definition: points.c:14
void nrerror(char *error_text)
Definition: lineread.c:7
char opt_num[NAME_LENGTH]
Definition: constype.h:196
double * centerpnt
Definition: points.c:14
#define LINE_LENGTH
Definition: constype.h:4
static int run_boundary()
Definition: margins.c:18
char(* names)[NAME_LENGTH]
Definition: points.c:15
char bound_ext[NAME_LENGTH]
Definition: constype.h:178
#define PARAM_FILE
Definition: filenames.h:9