9 #define API_USE_REAL_TYPES
12 static char *inffigurename
=".unknown.", warned
=0;
15 void inf_DumpRegistry_i(char *name
)
17 inffig_list
*ifl
=getloadedinffig(name
);
18 inf_DumpRegistry(stdout
,ifl
,0);
21 void inf_CheckRegistry_i(char *name
, int level
, chain_list
*data
)
23 inffig_list
*ifl
=getloadedinffig(name
);
24 inf_CheckRegistry(stdout
,ifl
,level
,data
);
27 inffig_list
*__giveinf()
30 if (warned
==0 && inffigurename
==".unknown.")
32 avt_errmsg(INF_API_ERRMSG
, "001", AVT_FATAL
);
33 // avt_error("infapi", AVT_WAR, 1, "you must first use 'inf_SetFigureName' prior to use other functions\n");
36 if ((ifl
=getloadedinffig(inffigurename
))!=NULL
) return ifl
;
37 ifl
=addinffig(inffigurename
);
41 void inf_SetFigureName(char *name
)
43 inffigurename
=namealloc(name
);
46 void inf_LoadInformationFile(char *figname
)
50 if ((ifl
=getinffig(figname
))==NULL
)
52 avt_errmsg(INF_API_ERRMSG
, "002", AVT_WARNING
, figname
);
53 // avt_error("infapi", AVT_WAR, 2, "figure '%s' could not be found\n",figname);
54 ifl
=addinffig(figname
);
57 inf_SetFigureName(figname
);
60 void inf_LoadAndMergeInformationFile(char *figname
)
63 inf_SetFigureName(figname
);
66 void inf_AddFile(char *filename
, char *figname
)
70 ret
=_infRead(figname
, filename
, 0);
71 avt_log(LOGFILEACCESS
, 0, "Loading INF file \"%s\" for figure \"%s\"%s\n", filename
, figname
,ret
!=NULL
?" done.":" failed.");
72 // avt_error("infapi", -1, AVT_INFO, "load INF '¤2%s¤.' for figure '%s'%s\n", filename, figname,ret!=NULL?" ¤7done¤.":" ¤6failed¤.");
76 void inf_Drive(char *outputname
)
80 infDrive(ifl
, outputname
, INF_LOADED_LOCATION
, NULL
);
83 void inf_ExportSections(char *outputname
, char *section
)
87 infDrive_filtered(ifl
, outputname
, INF_LOADED_LOCATION
, NULL
, section
);
90 void inf_DefineSlew(char *name
, double slope_rise
, double slope_fall
)
94 if (slope_rise
<1e-12) slope_rise
=1e-12;
95 if (slope_fall
<1e-12) slope_fall
=1e-12;
96 inf_AddDouble(ifl
, INF_LOADED_LOCATION
, mbk_decodeanyvector(name
), INF_PIN_RISING_SLEW
, slope_rise
, NULL
);
97 inf_AddDouble(ifl
, INF_LOADED_LOCATION
, mbk_decodeanyvector(name
), INF_PIN_FALLING_SLEW
, slope_fall
, NULL
);
100 void inf_DefineSlope(char *name
, double slope_rise
, double slope_fall
)
102 inf_DefineSlew(name
, slope_rise
, slope_fall
);
105 void inf_DefineDelay(char *origin
, char *destination
, double delay
)
109 inf_AddAssociation(ifl
, INF_LOADED_LOCATION
, INF_DELAY
, "", mbk_decodeanyvector(origin
), mbk_decodeanyvector(destination
), 0, delay
, NULL
);
112 void inf_DefineStop(char *name
)
116 inf_AddString(ifl
, INF_LOADED_LOCATION
, infTasVectName(name
), INF_STOP
, NULL
, NULL
);
119 void inf_DefineRename(char *origin
, char *destination
)
123 inf_AddAssociation(ifl
, INF_LOADED_LOCATION
, INF_RENAME
, "", mbk_decodeanyvector(origin
), mbk_decodeanyvector(destination
), 0, 0, NULL
);
126 void inf_DefineMemsym(char *origin
, char *destination
)
130 inf_AddAssociation(ifl
, INF_LOADED_LOCATION
, INF_MEMSYM
, "", mbk_decodeanyvector(origin
), mbk_decodeanyvector(destination
), 0, 0, NULL
);
133 void inf_DefineSensitive(char *name
)
137 inf_AddString(ifl
, INF_LOADED_LOCATION
, mbk_decodeanyvector(name
), INF_SENSITIVE
, NULL
, NULL
);
140 void inf_DefineSuppress(char *name
)
144 inf_AddString(ifl
, INF_LOADED_LOCATION
, mbk_decodeanyvector(name
), INF_SUPPRESS
, NULL
, NULL
);
147 void inf_DefineInputs(char *name
)
151 inf_AddString(ifl
, INF_LOADED_LOCATION
, mbk_decodeanyvector(name
), INF_INPUTS
, NULL
, NULL
);
154 void inf_DefineNotLatch(char *name
)
158 inf_AddString(ifl
, INF_LOADED_LOCATION
, mbk_decodeanyvector(name
), INF_NOTLATCH
, NULL
, NULL
);
161 void inf_DefineKeepTristateBehaviour(char *name
)
165 inf_AddString(ifl
, INF_LOADED_LOCATION
, mbk_decodeanyvector(name
), INF_KEEP_TRISTATE_BEHAVIOUR
, NULL
, NULL
);
168 void inf_DefineRC(char *name
)
172 inf_AddString(ifl
, INF_LOADED_LOCATION
, infTasVectName(name
), INF_RC
, INF_YES
, NULL
);
175 void inf_DefineNORC(char *name
)
179 inf_AddString(ifl
, INF_LOADED_LOCATION
, infTasVectName(name
), INF_RC
, INF_NO
, NULL
);
182 void inf_DefineAsynchron(char *name
)
186 inf_AddString(ifl
, INF_LOADED_LOCATION
, infTasVectName(name
), INF_ASYNCHRON
, NULL
, NULL
);
189 void inf_DefineDoNotCross(char *name
)
193 inf_AddString(ifl
, INF_LOADED_LOCATION
, infTasVectName(name
), INF_DONTCROSS
, NULL
, NULL
);
196 void inf_DefineTransparent(char *name
)
200 inf_AddString(ifl
, INF_LOADED_LOCATION
, infTasVectName(name
), INF_TRANSPARENT
, NULL
, NULL
);
203 void inf_DefineInter(char *name
)
207 inf_AddString(ifl
, INF_LOADED_LOCATION
, infTasVectName(name
), INF_INTER
, NULL
, NULL
);
210 void inf_DefineBreak(char *name
)
214 inf_AddString(ifl
, INF_LOADED_LOCATION
, infTasVectName(name
), INF_BREAK
, NULL
, NULL
);
217 void inf_DefineStrictSetup(char *name
)
221 inf_AddString(ifl
, INF_LOADED_LOCATION
, infTasVectName(name
), INF_STRICT_SETUP
, NULL
, NULL
);
224 void inf_DefineCkPrech(char *name
)
228 inf_AddString(ifl
, INF_LOADED_LOCATION
, mbk_decodeanyvector(name
), INF_CKPRECH
, NULL
, NULL
);
231 void inf_DefineNoFalling(char *name
)
235 inf_AddString(ifl
, INF_LOADED_LOCATION
, infTasVectName(name
), INF_NOFALLING
, NULL
, NULL
);
238 void inf_DefineNoRising(char *name
)
242 inf_AddString(ifl
, INF_LOADED_LOCATION
, infTasVectName(name
), INF_NORISING
, NULL
, NULL
);
245 void inf_SetPeriod(double value
)
249 inf_AddDouble(ifl
, INF_LOADED_LOCATION
, INF_STB_HEADER
, INF_DEFAULT_PERIOD
, value
, NULL
);
252 void inf_SetSetupMargin(double value
)
256 inf_AddDouble(ifl
, INF_LOADED_LOCATION
, INF_STB_HEADER
, INF_SETUPMARGIN
, value
, NULL
);
259 void inf_SetHoldMargin(double value
)
263 inf_AddDouble(ifl
, INF_LOADED_LOCATION
, INF_STB_HEADER
, INF_HOLDMARGIN
, value
, NULL
);
266 void inf_DefineConstraint(char *name
, int value
)
270 inf_AddInt(ifl
, INF_LOADED_LOCATION
, mbk_decodeanyvector(name
), INF_STUCK
, value
?1:0, NULL
);
273 void inf_DefineConditionedCommandStates(char *name
, char *state
)
278 if (strcasecmp(state
,"up")==0) state
=INF_VERIFUP
;
279 else if (strcasecmp(state
,"down")==0) state
=INF_VERIFDOWN
;
280 else if (strcasecmp(state
,"rising")==0) state
=INF_VERIFRISE
;
281 else if (strcasecmp(state
,"falling")==0) state
=INF_VERIFFALL
;
282 else if (strcasecmp(state
,"noverif")==0) state
=INF_NOVERIF
;
285 avt_errmsg(INF_API_ERRMSG
, "003", AVT_ERROR
, state
);
286 // avt_error("infapi", AVT_ERR, 1, "invalid command state given: '%s'\n", state);
289 inf_AddString(ifl
, INF_LOADED_LOCATION
, infTasVectName(name
), INF_VERIF_STATE
, state
, NULL
);
292 void inf_DefineClockPriority(char *name
, char *clock
)
296 inf_AddString(ifl
, INF_LOADED_LOCATION
, infTasVectName(name
), INF_PREFERED_CLOCK
, infTasVectName(clock
), NULL
);
299 void inf_DefineDLatch(char *name
)
303 inf_AddString(ifl
, INF_LOADED_LOCATION
, mbk_decodeanyvector(name
), INF_DLATCH
, INF_YES
, NULL
);
306 void inf_DefineFlipFlop(char *name
)
310 inf_AddString(ifl
, INF_LOADED_LOCATION
, infTasVectName(name
), INF_FLIPFLOP
, NULL
, NULL
);
313 void inf_DefineNotDLatch(char *name
)
317 inf_AddString(ifl
, INF_LOADED_LOCATION
, mbk_decodeanyvector(name
), INF_DLATCH
, INF_NO
, NULL
);
320 void inf_DefinePrecharge(char *name
)
324 inf_AddString(ifl
, INF_LOADED_LOCATION
, mbk_decodeanyvector(name
), INF_PRECHARGE
, INF_YES
, NULL
);
327 void inf_DefineNotPrecharge(char *name
)
331 inf_AddString(ifl
, INF_LOADED_LOCATION
, mbk_decodeanyvector(name
), INF_PRECHARGE
, INF_NO
, NULL
);
334 void inf_DefineModelLatchLoop(char *name
)
338 inf_AddString(ifl
, INF_LOADED_LOCATION
, mbk_decodeanyvector(name
), INF_MODELLOOP
, INF_YES
, NULL
);
341 void inf_DefineCkLatch(char *name
)
345 inf_AddString(ifl
, INF_LOADED_LOCATION
, mbk_decodeanyvector(name
), INF_CKLATCH
, INF_YES
, NULL
);
348 void inf_DefineNotCkLatch(char *name
)
352 inf_AddString(ifl
, INF_LOADED_LOCATION
, mbk_decodeanyvector(name
), INF_CKLATCH
, INF_NO
, NULL
);
355 void inf_DefineDirout(char *name
, int level
)
359 inf_AddInt(ifl
, INF_LOADED_LOCATION
, mbk_decodeanyvector(name
), INF_DIROUT
, level
, NULL
);
362 void inf_DefineClock(chain_list
*elems
)
367 double minup
, maxup
, mindown
, maxdown
, period
, mult
, delta
;
371 if (strcasecmp(elems
->DATA
,"virtual")==0) mode
=INF_CLOCK_VIRTUAL
, elems
=elems
->NEXT
;
372 else if (strcasecmp(elems
->DATA
,"ideal")==0) mode
=INF_CLOCK_IDEAL
, elems
=elems
->NEXT
;
375 if (elems
!=NULL
&& strcasecmp(elems
->DATA
,"!")==0) mode
|=INF_CLOCK_INVERTED
, elems
=elems
->NEXT
;
379 aname
=infTasVectName((char *)elems
->DATA
);
383 inf_AddInt(ifl
, INF_LOADED_LOCATION
, aname
, INF_CLOCK_TYPE
, mode
, NULL
);
387 if (strcasecmp(elems
->DATA
,"clock")!=0)
389 if (countchain(elems
)>=5)
391 minup
=avt_parse_unit((char *)elems
->DATA
, 't'); elems
=elems
->NEXT
;
392 maxup
=avt_parse_unit((char *)elems
->DATA
, 't'); elems
=elems
->NEXT
;
393 mindown
=avt_parse_unit((char *)elems
->DATA
, 't'); elems
=elems
->NEXT
;
394 maxdown
=avt_parse_unit((char *)elems
->DATA
, 't'); elems
=elems
->NEXT
;
395 period
=avt_parse_unit((char *)elems
->DATA
, 't'); elems
=elems
->NEXT
;
398 avt_errmsg(INF_API_ERRMSG
, "004", AVT_ERROR
);
399 // avt_error("infapi", 6, AVT_ERR, "missing clock parameter\n");
404 if (countchain(elems
)>=3)
406 bname
=infTasVectName((char *)elems
->DATA
); elems
=elems
->NEXT
;
407 mult
=atof((char *)elems
->DATA
); elems
=elems
->NEXT
;
408 delta
=avt_parse_unit((char *)elems
->DATA
, 't'); elems
=elems
->NEXT
;
410 if (inf_GetInt(ifl
, bname
, INF_CLOCK_TYPE
, &val
)==0)
411 avt_errmsg(INF_API_ERRMSG
, "005", AVT_ERROR
, bname
);
412 // avt_error("infapi", 11, AVT_ERR, "clock '%s' not defined yet\n", bname);
415 double per
, defper
, min
;
416 double minr
=0, maxr
=0, minf
=1e-12, maxf
=1e-12;
417 if (!inf_GetDouble(ifl
, INF_STB_HEADER
, INF_DEFAULT_PERIOD
, &defper
)) defper
=-1;
418 if (!inf_GetDouble(ifl
, bname
, INF_CLOCK_PERIOD
, &per
)) per
=-1;
420 if (defper
==-1 && per
==-1 && fabs(mult
-1)<=1e-15)
421 avt_errmsg(INF_API_ERRMSG
, "006", AVT_ERROR
, bname
);
422 // avt_error("infapi", 12, AVT_ERR, "no period specified for clock '%s' or no default period\n", bname);
432 inf_GetDouble(INF_FIG
, bname
, INF_MIN_RISE_TIME
, &minr
);
433 inf_GetDouble(INF_FIG
, bname
, INF_MAX_RISE_TIME
, &maxr
);
434 inf_GetDouble(INF_FIG
, bname
, INF_MIN_FALL_TIME
, &minf
);
435 inf_GetDouble(INF_FIG
, bname
, INF_MAX_FALL_TIME
, &maxf
);
437 if (minr
<minf
) min
=minr
; else min
=minf
;
439 minup
=min
+(minr
-min
)*mult
+delta
;
440 maxup
=min
+(maxr
-min
)*mult
+delta
;
441 mindown
=min
+(minf
-min
)*mult
+delta
;
442 maxdown
=min
+(maxf
-min
)*mult
+delta
;
444 if ((val
& INF_CLOCK_INVERTED
)!=0)
446 min
=minup
; minup
=mindown
; mindown
=min
;
447 min
=maxup
; maxup
=maxdown
; maxdown
=min
;
453 avt_errmsg(INF_API_ERRMSG
, "007", AVT_ERROR
);
454 // avt_error("infapi", 6, AVT_ERR, "missing clock parameter\n");
457 if (mode
& INF_CLOCK_IDEAL
)
459 if (countchain(elems
)>=4)
462 minup
+=avt_parse_unit((char *)elems
->DATA
, 't'); elems
=elems
->NEXT
;
463 maxup
+=avt_parse_unit((char *)elems
->DATA
, 't'); elems
=elems
->NEXT
;
464 mindown
+=avt_parse_unit((char *)elems
->DATA
, 't'); elems
=elems
->NEXT
;
465 maxdown
+=avt_parse_unit((char *)elems
->DATA
, 't'); elems
=elems
->NEXT
;
467 else if (countchain(elems
)!=0)
468 avt_errmsg(INF_API_ERRMSG
, "007", AVT_ERROR
);
469 // avt_error("infapi", 6, AVT_ERR, "missing clock parameter\n");
473 avt_errmsg(INF_API_ERRMSG
, "008", AVT_ERROR
, (char *)elems
->DATA
);
474 //avt_error("infapi", 5, AVT_WAR, "too many parameters starting at '%s'\n", (char *)elems->DATA);
476 inf_AddDouble(ifl
, INF_LOADED_LOCATION
, aname
, INF_MIN_RISE_TIME
, minup
, NULL
);
477 inf_AddDouble(ifl
, INF_LOADED_LOCATION
, aname
, INF_MAX_RISE_TIME
, maxup
, NULL
);
479 inf_AddDouble(ifl
, INF_LOADED_LOCATION
, aname
, INF_MIN_FALL_TIME
, mindown
, NULL
);
480 inf_AddDouble(ifl
, INF_LOADED_LOCATION
, aname
, INF_MAX_FALL_TIME
, maxdown
, NULL
);
483 inf_AddDouble(ifl
, INF_LOADED_LOCATION
, aname
, INF_CLOCK_PERIOD
, period
, NULL
);
487 avt_errmsg(INF_API_ERRMSG
, "007", AVT_ERROR
);
488 // avt_error("infapi", 6, AVT_ERR, "missing clock parameter\n");
491 avt_errmsg(INF_API_ERRMSG
, "007", AVT_ERROR
);
492 // avt_error("infapi", 6, AVT_ERR, "missing clock parameter\n");
496 void inf_DefineClock(char *name, double minup, double maxup, double mindown, double maxdown, double period)
502 aname=infTasVectName(name);
503 inf_AddInt(ifl, INF_LOADED_LOCATION, aname, INF_CLOCK_TYPE, 0, NULL);
505 inf_AddDouble(ifl, INF_LOADED_LOCATION, aname, INF_MIN_RISE_TIME, minup, NULL);
506 inf_AddDouble(ifl, INF_LOADED_LOCATION, aname, INF_MAX_RISE_TIME, maxup, NULL);
508 inf_AddDouble(ifl, INF_LOADED_LOCATION, aname, INF_MIN_FALL_TIME, mindown, NULL);
509 inf_AddDouble(ifl, INF_LOADED_LOCATION, aname, INF_MAX_FALL_TIME, maxdown, NULL);
512 inf_AddDouble(ifl, INF_LOADED_LOCATION, aname, INF_CLOCK_PERIOD, period, NULL);
516 void inf_DefineBypass(char *name
, char *where
)
521 if (strcasecmp(where
,"<")==0) where
=INF_IN
;
522 else if (strcasecmp(where
,">")==0) where
=INF_OUT
;
523 else if (strcasecmp(where
,"!")==0) where
=INF_ONLYEND
;
524 else if (strcasecmp(where
,"")==0) where
=INF_ALL
;
527 avt_errmsg(INF_API_ERRMSG
, "009", AVT_ERROR
, where
);
528 // avt_error("infapi", AVT_ERR, 2, "invalid bypass location given: '%s'\n", where);
531 inf_AddString(ifl
, INF_LOADED_LOCATION
, infTasVectName(name
), INF_BYPASS
, where
, NULL
);
534 void inf_DefineMutex(char *type
, chain_list
*list
)
541 if (strcasecmp(type
,"muxup")==0) type
=INF_MUXU
;
542 else if (strcasecmp(type
,"muxdn")==0) type
=INF_MUXD
;
543 else if (strcasecmp(type
,"cmpup")==0) type
=INF_CMPU
;
544 else if (strcasecmp(type
,"cmpdn")==0) type
=INF_CMPD
;
547 avt_errmsg(INF_API_ERRMSG
, "010", AVT_ERROR
, type
);
548 // avt_error("infapi", AVT_ERR, 3, "unknown mutex type given: '%s'\n", type);
552 cl
=dupchainlst(list
);
553 for (ch
=cl
; ch
!=NULL
; ch
=ch
->NEXT
)
554 ch
->DATA
=mbk_decodeanyvector((char *)ch
->DATA
);
555 inf_AddList(ifl
, INF_LOADED_LOCATION
, type
, "", cl
, NULL
);
558 void inf_DefineCrosstalkMutex(char *type
, chain_list
*list
)
565 if (strcasecmp(type
,"muxup")==0) type
=INF_CROSSTALKMUXU
;
566 else if (strcasecmp(type
,"muxdn")==0) type
=INF_CROSSTALKMUXD
;
569 avt_errmsg(INF_API_ERRMSG
, "011", AVT_ERROR
, type
);
570 // avt_error("infapi", AVT_ERR, 3, "unknown crosstalk mutex type given: '%s'\n", type);
574 cl
=dupchainlst(list
);
575 for (ch
=cl
; ch
!=NULL
; ch
=ch
->NEXT
)
576 ch
->DATA
=mbk_decodeanyvector((char *)ch
->DATA
);
577 inf_AddList(ifl
, INF_LOADED_LOCATION
, type
, "", cl
, NULL
);
580 void inf_DefineDisable(char *origin
, char *destination
)
587 if (origin
==NULL
|| strcmp(origin
,"")==0) o
=NULL
;
588 else o
=infTasVectName(origin
);
589 if (destination
==NULL
|| strcmp(destination
,"")==0) d
=NULL
;
590 else d
=infTasVectName(destination
);
592 if (o
==NULL
&& d
==NULL
) return;
594 inf_AddAssociation(ifl
, INF_LOADED_LOCATION
, INF_DISABLE_PATH
, "", o
, d
, 0, 0, NULL
);
597 void inf_CleanFigure()
601 infClean(ifl
, INF_LOADED_LOCATION
);
604 void inf_DefineAsynchronousClockGroup(char *domain
, chain_list
*list
, double period
)
611 for (ch
=list
; ch
!=NULL
; ch
=ch
->NEXT
)
612 inf_AddString(ifl
, INF_LOADED_LOCATION
, infTasVectName((char *)ch
->DATA
), INF_ASYNC_CLOCK_GROUP
, infTasVectName(domain
), NULL
);
615 inf_AddDouble(ifl
, INF_LOADED_LOCATION
, INF_ASYNC_CLOCK_GROUP_PERIOD
, infTasVectName(domain
), period
, NULL
);
618 void inf_DefineEquivalentClockGroup(char *domain
, chain_list
*list
)
625 for (ch
=list
; ch
!=NULL
; ch
=ch
->NEXT
)
626 inf_AddString(ifl
, INF_LOADED_LOCATION
, infTasVectName((char *)ch
->DATA
), INF_EQUIV_CLOCK_GROUP
, infTasVectName(domain
), NULL
);
629 void inf_DefinePower(char *name
, double voltage
)
634 inf_AddDouble(ifl
, INF_LOADED_LOCATION
, mbk_decodeanyvector(name
), INF_POWER
, voltage
, NULL
);
637 void inf_DefineTemperature(double temp
)
642 inf_AddDouble(ifl
, INF_LOADED_LOCATION
, INF_OPERATING_CONDITION
, INF_TEMPERATURE
,temp
,NULL
);
645 void inf_DefineFalsePath(chain_list
*elems
)
652 while (elems
!=NULL
&& strcmp(elems
->DATA
,":")!=0)
654 if (strcasecmp(elems
->DATA
,"<void>")==0)
655 name
=NULL
, type
=INF_NOTHING
;
658 name
=infTasVectName(elems
->DATA
);
660 if (elems
->NEXT
!=NULL
)
662 if (strcasecmp(elems
->NEXT
->DATA
,"<up>")==0 || strcasecmp(elems
->NEXT
->DATA
,"<rise>")==0) type
=INF_UP
, elems
=elems
->NEXT
;
663 else if (strcasecmp(elems
->NEXT
->DATA
,"<down>")==0 || strcasecmp(elems
->NEXT
->DATA
,"<fall>")==0) type
=INF_DOWN
, elems
=elems
->NEXT
;
666 pt
=addptype(pt
, type
, name
);
670 while (pt
!=NULL
&& pt
->TYPE
==INF_NOTHING
) pt
=delptype(pt
, INF_NOTHING
);
671 pt
=(ptype_list
*)reverse((chain_list
*)pt
);
672 while (pt
!=NULL
&& pt
->TYPE
==INF_NOTHING
) pt
=delptype(pt
, INF_NOTHING
);
673 pt
=(ptype_list
*)reverse((chain_list
*)pt
);
675 if (pt
==NULL
) // { avt_error("infapi", 6, AVT_WAR, "no signal elements in falsepath\n"); }
676 avt_errmsg(INF_API_ERRMSG
, "012", AVT_ERROR
);
681 if (elems
->NEXT
==NULL
)
682 avt_errmsg(INF_API_ERRMSG
, "007", AVT_ERROR
);
683 // { avt_error("infapi", 6, AVT_ERR, "missing clock parameter\n"); }
684 else if (elems
->NEXT
->NEXT
!=NULL
)
685 avt_errmsg(INF_API_ERRMSG
, "008", AVT_ERROR
, (char *)elems
->NEXT
->NEXT
->DATA
);
686 // { avt_error("infapi", 5, AVT_WAR, "too many parameters starting at '%s'\n", (char *)elems->NEXT->NEXT->DATA); }
689 if (strcasecmp((char *)elems
->NEXT
->DATA
, "<hz>")==0)
690 pt
=addptype(pt
, INF_CK
, infTasVectName("^"));
691 else if (strcasecmp((char *)elems
->NEXT
->DATA
, "<nothz>")==0)
692 pt
=addptype(pt
, INF_CK
, infTasVectName("°"));
694 pt
=addptype(pt
, INF_CK
, infTasVectName(elems
->NEXT
->DATA
));
702 pt
=(ptype_list
*)reverse((chain_list
*)pt
);
703 ifl
->LOADED
.INF_FALSEPATH
=addchain(ifl
->LOADED
.INF_FALSEPATH
, pt
);
707 void inf_DefinePathDelayMargin(char *type
, char *name
, double factor
, double delta
, char *pathtype_s
)
709 int sigtype
, pathtype
, i
, j
, k
;
719 {INF_MARGIN_ON_MINDELAY
, INF_PATHDELAYMARGINMIN
},
720 {INF_MARGIN_ON_MAXDELAY
, INF_PATHDELAYMARGINMAX
},
721 {INF_MARGIN_ON_CLOCKPATH
, INF_PATHDELAYMARGINCLOCK
},
722 {INF_MARGIN_ON_DATAPATH
, INF_PATHDELAYMARGINDATA
},
723 {INF_MARGIN_ON_RISEDELAY
, INF_PATHDELAYMARGINRISE
},
724 {INF_MARGIN_ON_FALLDELAY
, INF_PATHDELAYMARGINFALL
}
728 if (strcasecmp(type
,"any")==0) sigtype
=INF_MARGIN_ON_LATCH
|INF_MARGIN_ON_BREAK
|INF_MARGIN_ON_CONNECTOR
|INF_MARGIN_ON_PRECHARGE
|INF_MARGIN_ON_CMD
;
729 else if (strcasecmp(type
,"latch")==0) sigtype
=INF_MARGIN_ON_LATCH
;
730 else if (strcasecmp(type
,"prech")==0) sigtype
=INF_MARGIN_ON_PRECHARGE
;
731 else if (strcasecmp(type
,"break")==0) sigtype
=INF_MARGIN_ON_BREAK
;
732 else if (strcasecmp(type
,"cmd")==0) sigtype
=INF_MARGIN_ON_CMD
;
733 else if (strcasecmp(type
,"con")==0) sigtype
=INF_MARGIN_ON_CONNECTOR
;
736 avt_errmsg(INF_API_ERRMSG
, "013", AVT_ERROR
, type
);
737 // avt_error("infapi", 7, AVT_ERR, "invalid signal type '%s'\n", type);
742 strcpy(buf
, pathtype_s
);
743 tok
=strtok_r(buf
, " _", &c
);
746 if (strcasecmp(tok
,"min")==0) pathtype
|=INF_MARGIN_ON_MINDELAY
;
747 else if (strcasecmp(tok
,"max")==0) pathtype
|=INF_MARGIN_ON_MAXDELAY
;
748 else if (strcasecmp(tok
,"rise")==0) pathtype
|=INF_MARGIN_ON_RISEDELAY
;
749 else if (strcasecmp(tok
,"fall")==0) pathtype
|=INF_MARGIN_ON_FALLDELAY
;
750 else if (strcasecmp(tok
,"clockpath")==0) pathtype
|=INF_MARGIN_ON_CLOCKPATH
;
751 else if (strcasecmp(tok
,"datapath")==0) pathtype
|=INF_MARGIN_ON_DATAPATH
;
754 avt_errmsg(INF_API_ERRMSG
, "014", AVT_ERROR
, tok
);
755 // avt_error("infapi", 8, AVT_ERR, "unrecognized token '%s'\n", tok);
757 tok
=strtok_r(NULL
, " ", &c
);
762 if (fabs(delta
)>=1) delta
*=1e-12;
764 if ((pathtype
& (INF_MARGIN_ON_MINDELAY
|INF_MARGIN_ON_MAXDELAY
))==0)
765 pathtype
|=INF_MARGIN_ON_MINDELAY
|INF_MARGIN_ON_MAXDELAY
;
766 if ((pathtype
& (INF_MARGIN_ON_CLOCKPATH
|INF_MARGIN_ON_DATAPATH
))==0)
767 pathtype
|=INF_MARGIN_ON_CLOCKPATH
|INF_MARGIN_ON_DATAPATH
;
768 if ((pathtype
& (INF_MARGIN_ON_RISEDELAY
|INF_MARGIN_ON_FALLDELAY
))==0)
769 pathtype
|=INF_MARGIN_ON_RISEDELAY
|INF_MARGIN_ON_FALLDELAY
;
775 if ((pathtype
& (run
[i
].t
|run
[j
].t
|run
[k
].t
))==(run
[i
].t
|run
[j
].t
|run
[k
].t
))
777 sprintf(section
,INF_PATHDELAYMARGINPREFIX
"|%s,%s,%s",run
[i
].s
, run
[j
].s
, run
[k
].s
);
778 inf_AddMiscData(ifl
, INF_LOADED_LOCATION
, infTasVectName(name
), section
, NULL
, NULL
, pathtype
|sigtype
, factor
, delta
, NULL
);
784 if ((pathtype & (INF_MARGIN_ON_MINDELAY|INF_MARGIN_ON_CLOCKPATH))==(INF_MARGIN_ON_MINDELAY|INF_MARGIN_ON_CLOCKPATH))
785 inf_AddMiscData(ifl, INF_LOADED_LOCATION, infTasVectName(name), INF_PATHDELAYMARGINCLOCKMIN, NULL, NULL, pathtype|sigtype, factor, delta, NULL);
787 if ((pathtype & (INF_MARGIN_ON_MAXDELAY|INF_MARGIN_ON_CLOCKPATH))==(INF_MARGIN_ON_MAXDELAY|INF_MARGIN_ON_CLOCKPATH))
788 inf_AddMiscData(ifl, INF_LOADED_LOCATION, infTasVectName(name), INF_PATHDELAYMARGINCLOCKMAX, NULL, NULL, pathtype|sigtype, factor, delta, NULL);
790 if ((pathtype & (INF_MARGIN_ON_MINDELAY|INF_MARGIN_ON_DATAPATH))==(INF_MARGIN_ON_MINDELAY|INF_MARGIN_ON_DATAPATH))
791 inf_AddMiscData(ifl, INF_LOADED_LOCATION, infTasVectName(name), INF_PATHDELAYMARGINDATAMIN, NULL, NULL, pathtype|sigtype, factor, delta, NULL);
793 if ((pathtype & (INF_MARGIN_ON_MAXDELAY|INF_MARGIN_ON_DATAPATH))==(INF_MARGIN_ON_MAXDELAY|INF_MARGIN_ON_DATAPATH))
794 inf_AddMiscData(ifl, INF_LOADED_LOCATION, infTasVectName(name), INF_PATHDELAYMARGINDATAMAX, NULL, NULL, pathtype|sigtype, factor, delta, NULL);
800 void inf_DefineIgnore(char *type
, chain_list
*list
)
808 if (strcasecmp(type
,"instance")==0 || strcasecmp(type
,"instances")==0)
809 section_type
=INF_IGNORE_INSTANCE
;
810 else if (strcasecmp(type
,"transistor")==0 || strcasecmp(type
,"transistors")==0)
811 section_type
=INF_IGNORE_TRANSISTOR
;
812 else if (strcasecmp(type
,"resistance")==0 || strcasecmp(type
,"resistances")==0)
813 section_type
=INF_IGNORE_RESISTANCE
;
814 else if (strcasecmp(type
,"diode")==0 || strcasecmp(type
,"diodes")==0)
815 section_type
=INF_IGNORE_DIODE
;
816 else if (strcasecmp(type
,"capacitance")==0 || strcasecmp(type
,"capacitances")==0)
817 section_type
=INF_IGNORE_CAPACITANCE
;
818 else if (strcasecmp(type
,"signalname")==0 || strcasecmp(type
,"signalnames")==0)
819 section_type
=INF_IGNORE_NAMES
;
820 else if (strcasecmp(type
,"parasitics")==0)
821 section_type
=INF_IGNORE_PARASITICS
;
824 avt_errmsg(INF_API_ERRMSG
, "015", AVT_ERROR
, type
);
825 // avt_error("infapi", 9, AVT_ERR, "unknown section '%s', ignoring section.\n", type);
829 if (section_type
!=NULL
)
830 for (ch
=list
; ch
!=NULL
; ch
=ch
->NEXT
)
831 inf_AddAssociation(ifl
, INF_LOADED_LOCATION
, section_type
, "", namealloc((char *)ch
->DATA
), NULL
, 0, 0, NULL
);
834 void inf_DefineConnectorDirections(char *type
, chain_list
*list
)
842 if (strcasecmp(type
,"input")==0) val
="I";
843 else if (strcasecmp(type
,"output")==0) val
="O";
844 else if (strcasecmp(type
,"inout")==0) val
="B";
845 else if (strcasecmp(type
,"tristate")==0) val
="T";
846 else if (strcasecmp(type
,"hz")==0) val
="Z";
847 else if (strcasecmp(type
,"unknown")==0) val
="X";
850 avt_errmsg(INF_API_ERRMSG
, "015", AVT_ERROR
, type
);
851 // avt_error("infapi", 10, AVT_ERR, "unknown direction '%s', ignoring section.\n", type);
856 for (ch
=list
; ch
!=NULL
; ch
=ch
->NEXT
)
857 inf_AddString(ifl
, INF_LOADED_LOCATION
, namealloc((char *)ch
->DATA
), INF_CONNECTOR_DIRECTION
, val
, NULL
);
861 void inf_DefineConnectorSwing(char *name
, double lowlevel
, double highlevel
)
867 name0
=infTasVectName (name
);
870 inf_AddDouble(ifl
, INF_LOADED_LOCATION
, name0
, INF_PIN_LOW_VOLTAGE
, lowlevel
, NULL
);
871 inf_AddDouble(ifl
, INF_LOADED_LOCATION
, name0
, INF_PIN_HIGH_VOLTAGE
, highlevel
, NULL
);
874 static void convert_data(inffig_list
*ifl
, char *name
, char *section
, chain_list
*data
, int mode
, char tm
)
879 for (cl
=data
, ch
=NULL
; cl
!=NULL
; cl
=cl
->NEXT
)
881 val
=avt_parse_unit((char *)cl
->DATA
, tm
);
882 al
=(double *)mbkalloc(sizeof(double));
890 inf_RemoveKey(ifl
, INF_LOADED_LOCATION
, name
, section
);
892 for (cl
=ch
; cl
!=NULL
; cl
=cl
->NEXT
)
894 inf_AddAssociation(ifl
, INF_LOADED_LOCATION
, name
, section
, NULL
, NULL
, 0, *(double *)cl
->DATA
, NULL
);
900 if (countchain(ch
)!=3)
901 avt_errmsg(INF_API_ERRMSG
, "017", AVT_ERROR
);
902 //avt_error("infapi", AVT_ERR, 11, "too much values for slope or capa generation\n");
905 double a
=*(double *)ch
->DATA
, b
=*(double *)ch
->NEXT
->DATA
, s
=*(double *)ch
->NEXT
->NEXT
->DATA
;
906 inf_RemoveKey(ifl
, INF_LOADED_LOCATION
, name
, section
);
907 for (val
= 0 ; val
<= (b
- a
+1e-18) / s
; val
++)
909 inf_AddAssociation(ifl
, INF_LOADED_LOCATION
, name
, section
, NULL
, NULL
, 0, a
+ s
* val
, NULL
);
912 for (cl
=ch
; cl
!=NULL
; cl
=cl
->NEXT
)
920 static void inf_DefineAxis(char *name
, chain_list
*list
, char *type
, char *section
, char tm
)
926 if (strcasecmp(type
,"linear")==0)
927 convert_data(ifl
, infTasVectName(name
), section
, list
, 1, tm
);
928 else if (strcasecmp(type
,"custom")==0)
929 convert_data(ifl
, infTasVectName(name
), section
, list
, 0, tm
);
931 avt_errmsg(INF_API_ERRMSG
, "018", AVT_ERROR
, type
);
932 // avt_error("infapi", AVT_ERR, 13, "unknown type given: '%s'\n", type);
935 void inf_DefineSlopeRange(char *name
, chain_list
*list
, char *type
)
937 inf_DefineAxis(name
, list
, type
, INF_SLOPEIN
, 't');
940 void inf_DefineCapacitanceRange(char *name
, chain_list
*list
, char *type
)
942 inf_DefineAxis(name
, list
, type
, INF_CAPAOUT
, 'c');
945 void inf_MarkSignal(char *name
, char *marks
)
947 inf_AddInt(__giveinf(), INF_LOADED_LOCATION
, mbk_decodeanyvector(name
), INF_MARKSIG
, inf_code_marksig(marks
), NULL
);
950 void inf_MarkTransistor(char *name
, char *marks
)
952 inf_AddInt(__giveinf(), INF_LOADED_LOCATION
, mbk_decodeanyvector(name
), INF_MARKTRANS
, inf_code_marktrans(marks
), NULL
);
955 void inf_DisableTimingArc(char *input
, char *output
, char *direction
)
958 if (strlen(direction
)==2)
960 if (tolower(direction
[0])=='u' || tolower(direction
[0])=='r') dir
=0x20;
961 else if (tolower(direction
[0])=='d' || tolower(direction
[0])=='f') dir
=0x10;
962 else if (direction
[0]=='?') dir
=0x30;
965 avt_errmsg(INF_API_ERRMSG
, "019", AVT_ERROR
, direction
);
966 // avt_error("infapi", AVT_ERR, 14, "inf_DisableTimingArc: invalid direction '%s'\n", direction);
970 if (tolower(direction
[1])=='u' || tolower(direction
[1])=='r') dir
|=0x02;
971 else if (tolower(direction
[1])=='d' || tolower(direction
[1])=='f') dir
|=0x01;
972 else if (direction
[1]=='?') dir
|=0x03;
975 avt_errmsg(INF_API_ERRMSG
, "019", AVT_ERROR
, direction
);
976 // avt_error("infapi", AVT_ERR, 14, "inf_DisableTimingArc: invalid direction '%s'\n", direction);
980 inf_AddAssociation(__giveinf(), INF_LOADED_LOCATION
, infTasVectName(output
), INF_DISABLE_GATE_DELAY
, infTasVectName(input
), NULL
, dir
, 0, NULL
);
983 avt_errmsg(INF_API_ERRMSG
, "019", AVT_ERROR
, direction
);
984 // avt_error("infapi", AVT_ERR, 14, "inf_DisableTimingArc: invalid direction '%s'\n", direction);
987 void inf_DefineCharacteristics(char *type
, chain_list
*list
)
995 if (strcasecmp(type
,"data")==0) val
=INF_CHARAC_DATA
;
998 avt_errmsg(INF_API_ERRMSG
, "020", AVT_ERROR
, type
);
999 // avt_error("infapi", 15, AVT_ERR, "unknown characteristic '%s', ignoring section.\n", type);
1004 for (ch
=list
; ch
!=NULL
; ch
=ch
->NEXT
)
1005 inf_AddString(ifl
, INF_LOADED_LOCATION
, namealloc((char *)ch
->DATA
), val
, type
, NULL
);
1009 void inf_DefineDirective_sub(chain_list
*list
)
1012 char temp
, temp1
, act
;
1014 splitint
*si
=(splitint
*)&val
;
1018 if (list
==NULL
) { avt_errmsg(INF_API_ERRMSG
, "024", AVT_ERROR
); return; }
1022 if (strcasecmp((char *)list
->DATA
, "filter")==0) si
->cval
.a
=INF_DIRECTIVE_FILTER
;
1023 else if (strcasecmp((char *)list
->DATA
, "check")==0) si
->cval
.a
=0;
1024 else { avt_errmsg(INF_API_ERRMSG
, "018", AVT_ERROR
, (char *)list
->DATA
); return; }
1027 if (list
==NULL
) { avt_errmsg(INF_API_ERRMSG
, "024", AVT_ERROR
); return; }
1029 if (strcasecmp((char *)list
->DATA
, "clock")==0) temp
=INF_DIRECTIVE_CLOCK
, list
=list
->NEXT
;
1030 else if (strcasecmp((char *)list
->DATA
, "data")==0) temp
=0, list
=list
->NEXT
;
1031 else temp
=0; //{ avt_errmsg(INF_API_ERRMSG, "018", AVT_ERROR, sig1type); return; }
1033 if (list
==NULL
) { avt_errmsg(INF_API_ERRMSG
, "024", AVT_ERROR
); return; }
1035 nom1
=(char *)list
->DATA
;
1038 if (list
==NULL
) { avt_errmsg(INF_API_ERRMSG
, "024", AVT_ERROR
); return; }
1040 if (!strcasecmp((char *)list
->DATA
,"rising")) temp
|=INF_DIRECTIVE_RISING
, list
=list
->NEXT
;
1041 else if (!strcasecmp((char *)list
->DATA
,"falling")) temp
|=INF_DIRECTIVE_FALLING
, list
=list
->NEXT
;
1042 // else temp|=INF_DIRECTIVE_FALLING|INF_DIRECTIVE_RISING;
1043 // else { avt_errmsg(INF_API_ERRMSG, "018", AVT_ERROR, dir1); return; }
1045 if (list
==NULL
) { avt_errmsg(INF_API_ERRMSG
, "024", AVT_ERROR
); return; }
1048 if (strcasecmp((char *)list
->DATA
, "before")==0) act
=INF_DIRECTIVE_BEFORE
;
1049 else if (strcasecmp((char *)list
->DATA
, "after")==0) act
=INF_DIRECTIVE_AFTER
;
1050 else if (strcasecmp((char *)list
->DATA
, "with")==0) act
=0;
1051 else { avt_errmsg(INF_API_ERRMSG
, "018", AVT_ERROR
, (char *)list
->DATA
); return; }
1054 if (list
==NULL
){ avt_errmsg(INF_API_ERRMSG
, "024", AVT_ERROR
); return; }
1056 if (strcasecmp((char *)list
->DATA
, "clock")==0) temp1
=INF_DIRECTIVE_CLOCK
, list
=list
->NEXT
;
1057 else if (strcasecmp((char *)list
->DATA
, "data")==0) temp1
=0, list
=list
->NEXT
;
1058 else if (strcasecmp((char *)list
->DATA
, "delay")==0) delaymode
=1;
1061 if (list
==NULL
) { avt_errmsg(INF_API_ERRMSG
, "024", AVT_ERROR
); return; }
1066 nom2
=(char *)list
->DATA
;
1069 if (list
==NULL
) { avt_errmsg(INF_API_ERRMSG
, "024", AVT_ERROR
); return; }
1073 if ((temp1
& INF_DIRECTIVE_CLOCK
)==0)
1074 { avt_errmsg(INF_API_ERRMSG
, "026", AVT_ERROR
); return; }
1075 if (!strcasecmp((char *)list
->DATA
,"up")) temp1
|=INF_DIRECTIVE_UP
;
1076 else if (!strcasecmp((char *)list
->DATA
,"down")) temp1
|=INF_DIRECTIVE_DOWN
;
1077 else { avt_errmsg(INF_API_ERRMSG
, "018", AVT_ERROR
, (char *)list
->DATA
); return; }
1081 if (!strcasecmp((char *)list
->DATA
,"rising")) temp1
|=INF_DIRECTIVE_RISING
;
1082 else if (!strcasecmp((char *)list
->DATA
,"falling")) temp1
|=INF_DIRECTIVE_FALLING
;
1083 else temp1
|=INF_DIRECTIVE_FALLING
|INF_DIRECTIVE_RISING
;
1084 // else { avt_errmsg(INF_API_ERRMSG, "018", AVT_ERROR, dir2); return; }
1087 if ((si
->cval
.a
& INF_DIRECTIVE_FILTER
)!=0 && ((temp
& INF_DIRECTIVE_CLOCK
)!=0 || (temp1
& INF_DIRECTIVE_CLOCK
)==0 || act
!=0))
1088 { avt_errmsg(INF_ERRMSG
, "027", AVT_ERROR
); return; }
1093 margin
=avt_parse_unit((char *)list
->DATA
, 't');
1094 if (list
->NEXT
!=NULL
) avt_errmsg(INF_API_ERRMSG
, "008", AVT_ERROR
, (char *)list
->NEXT
->DATA
);
1102 si
->cval
.d
=INF_DIRECTIVE_DELAY
;
1104 if (list
==NULL
) { avt_errmsg(INF_API_ERRMSG
, "024", AVT_ERROR
); return; }
1105 margin
=avt_parse_unit((char *)list
->DATA
, 't');
1107 if (list
!=NULL
&& !strcasecmp((char *)list
->DATA
,"from"))
1110 if (list
==NULL
) { avt_errmsg(INF_API_ERRMSG
, "024", AVT_ERROR
); return; }
1111 nom2
=(char *)list
->DATA
;
1116 if (!strcasecmp((char *)list
->DATA
,"rising")) temp1
|=INF_DIRECTIVE_RISING
;
1117 else if (!strcasecmp((char *)list
->DATA
,"falling")) temp1
|=INF_DIRECTIVE_FALLING
;
1122 if (list
!=NULL
) avt_errmsg(INF_API_ERRMSG
, "008", AVT_ERROR
, (char *)list
->NEXT
->DATA
);
1127 inf_AddAssociation(ifl
, INF_LOADED_LOCATION
, INF_DIRECTIVES
, "", infTasVectName(nom1
), infTasVectName(nom2
), val
, margin
, NULL
);
1130 void inf_DefineRS(char *name
, char *type
)
1132 int mark
=inf_code_markRS(type
);
1133 if (mark
!=0) inf_AddInt(__giveinf(), INF_LOADED_LOCATION
, mbk_decodeanyvector(name
), INF_MARKRS
, mark
, NULL
);
1134 else avt_errmsg(INF_ERRMSG
, "028", AVT_WARNING
, type
);
1137 void inf_DefineFalseSlack_sub(chain_list
*list
)
1139 char *nom1
, *nom2
, *nom3
, *nom4
;
1140 char dir1
, dir2
, dir3
, dir4
, what
;
1145 if (list
==NULL
) { avt_errmsg(INF_API_ERRMSG
, "024", AVT_ERROR
); return; }
1149 what
=INF_FALSESLACK_SETUP
|INF_FALSESLACK_HOLD
;
1150 nom1
=(char *)list
->DATA
;
1151 nom2
=strrchr(nom1
,':');
1152 if (nom2
!=NULL
&& *(nom2
+1)=='\0')
1154 char buf
[1024], *tok
, *c
;
1157 *strrchr(buf
,':')='\0';
1158 tok
=strtok_r(buf
, "-", &c
);
1161 if (strcasecmp(tok
, "setup")==0) val
|=INF_FALSESLACK_SETUP
;
1162 else if (strcasecmp(tok
, "hold")==0) val
|=INF_FALSESLACK_HOLD
;
1163 else if (strcasecmp(tok
, "latch")==0) val
|=INF_FALSESLACK_LATCH
;
1164 else if (strcasecmp(tok
, "prech")==0) val
|=INF_FALSESLACK_PRECH
;
1167 avt_errmsg(INF_API_ERRMSG
, "025", AVT_ERROR
, tok
);
1169 tok
=strtok_r(NULL
, " ", &c
);
1171 if ((val
& (INF_FALSESLACK_SETUP
|INF_FALSESLACK_HOLD
))==0)
1172 val
|=INF_FALSESLACK_SETUP
|INF_FALSESLACK_HOLD
;
1177 if (list
==NULL
) { avt_errmsg(INF_API_ERRMSG
, "024", AVT_ERROR
); return; }
1179 nom1
=(char *)list
->DATA
, list
=list
->NEXT
;
1180 if (list
==NULL
) { avt_errmsg(INF_API_ERRMSG
, "024", AVT_ERROR
); return; }
1182 if (strcasecmp((char *)list
->DATA
, "<up>")==0 || strcasecmp((char *)list
->DATA
, "<rise>")==0) dir1
=INF_FALSESLACK_UP
, list
=list
->NEXT
;
1183 else if (strcasecmp((char *)list
->DATA
, "<down>")==0 || strcasecmp((char *)list
->DATA
, "<fall>")==0) dir1
=INF_FALSESLACK_DOWN
, list
=list
->NEXT
;
1184 else dir1
=INF_FALSESLACK_UP
|INF_FALSESLACK_DOWN
;
1186 if (list
==NULL
) { avt_errmsg(INF_API_ERRMSG
, "024", AVT_ERROR
); return; }
1188 nom2
=(char *)list
->DATA
, list
=list
->NEXT
;
1189 if (list
==NULL
) { avt_errmsg(INF_API_ERRMSG
, "024", AVT_ERROR
); return; }
1191 if (strcasecmp((char *)list
->DATA
, "<up>")==0 || strcasecmp((char *)list
->DATA
, "<rise>")==0) dir2
=INF_FALSESLACK_UP
, list
=list
->NEXT
;
1192 else if (strcasecmp((char *)list
->DATA
, "<down>")==0 || strcasecmp((char *)list
->DATA
, "<fall>")==0) dir2
=INF_FALSESLACK_DOWN
, list
=list
->NEXT
;
1193 else dir2
=INF_FALSESLACK_UP
|INF_FALSESLACK_DOWN
;
1195 if (list
==NULL
) { avt_errmsg(INF_API_ERRMSG
, "024", AVT_ERROR
); return; }
1197 nom3
=(char *)list
->DATA
, list
=list
->NEXT
;
1198 if (list
==NULL
) { avt_errmsg(INF_API_ERRMSG
, "024", AVT_ERROR
); return; }
1200 if (strcasecmp((char *)list
->DATA
, "<up>")==0 || strcasecmp((char *)list
->DATA
, "<rise>")==0) dir3
=INF_FALSESLACK_UP
, list
=list
->NEXT
;
1201 else if (strcasecmp((char *)list
->DATA
, "<down>")==0 || strcasecmp((char *)list
->DATA
, "<fall>")==0) dir3
=INF_FALSESLACK_DOWN
, list
=list
->NEXT
;
1202 else dir3
=INF_FALSESLACK_UP
|INF_FALSESLACK_DOWN
;
1204 if (strcasecmp((char *)list
->DATA
, "<hz>")==0) dir3
|=INF_FALSESLACK_HZ
, list
=list
->NEXT
;
1205 else if (strcasecmp((char *)list
->DATA
, "<nothz>")==0) dir3
|=INF_FALSESLACK_NOTHZ
, list
=list
->NEXT
;
1206 else dir3
|=INF_FALSESLACK_HZ
|INF_FALSESLACK_NOTHZ
;
1208 if (list
==NULL
) { avt_errmsg(INF_API_ERRMSG
, "024", AVT_ERROR
); return; }
1210 nom4
=(char *)list
->DATA
, list
=list
->NEXT
;
1213 if (strcasecmp((char *)list
->DATA
, "<up>")==0 || strcasecmp((char *)list
->DATA
, "<rise>")==0) dir4
=INF_FALSESLACK_UP
, list
=list
->NEXT
;
1214 else if (strcasecmp((char *)list
->DATA
, "<down>")==0 || strcasecmp((char *)list
->DATA
, "<fall>")==0) dir4
=INF_FALSESLACK_DOWN
, list
=list
->NEXT
;
1215 else dir4
=INF_FALSESLACK_UP
|INF_FALSESLACK_DOWN
;
1217 else dir4
=INF_FALSESLACK_UP
|INF_FALSESLACK_DOWN
;
1219 if (list
!=NULL
) avt_errmsg(INF_API_ERRMSG
, "008", AVT_ERROR
, (char *)list
->DATA
);
1221 pt
=addptype(NULL
, dir4
, infTasVectName(nom4
));
1222 pt
=addptype(pt
, dir3
, infTasVectName(nom3
));
1223 pt
=addptype(pt
, dir2
, infTasVectName(nom2
));
1224 pt
=addptype(pt
, dir1
|what
, infTasVectName(nom1
));
1225 ifl
->LOADED
.INF_FALSESLACK
=addchain(ifl
->LOADED
.INF_FALSESLACK
, pt
);
1228 void inf_DefineSwitchingProbability(char *name
, double val
)
1233 if (val
>=0 && val
<=1)
1235 name
=infTasVectName (name
);
1236 inf_AddDouble(ifl
, INF_LOADED_LOCATION
, name
, INF_SWITCHING_PROBABILITY
, val
, NULL
);
1239 avt_errmsg(INF_API_ERRMSG
, "029", AVT_ERROR
, val
);