1 /****************************************************************************/
3 /* Chaine de CAO & VLSI Alliance */
5 /* Produit : YAGLE v1.n */
8 /* (c) copyright 1991 Laboratoire MASI equipe CAO & VLSI */
9 /* Tous droits reserves */
10 /* Support : e-mail cao-vlsi@masi.ibp.fr */
12 /* Auteur(s) : Marc LAURENTIN le : 06/09/1991 */
14 /* Modifie par : le : ../../.... */
15 /* Modifie par : le : ../../.... */
16 /* Modifie par : le : ../../.... */
18 /****************************************************************************/
30 static void infCleanRegistry(inffig_list
*ifl
, int location
);
31 void infrestart( FILE *input_file
) ;
38 int infParseLine
, inf_ignorename
=0;
39 static int INFDISPLAYLOAD
=0;
43 static int STUCK_SECTION
=INF_DEFAULT_LOCATION
|INF_LOADED_LOCATION
;
45 char *infFile
, *infname
;
47 int inf_StuckSection(int val
)
49 int old
=STUCK_SECTION
;
54 int inf_DisplayLoad(int val
)
56 int old
=INFDISPLAYLOAD
;
60 /****************************************************************************
61 * fonction infRead(); *
62 ****************************************************************************/
64 /*-------------------------------*
65 | lit le fichier <filename.inf> |
66 *------------------------------*/
67 static ht
*INF_HT
=NULL
;
70 int inf_getinffig_state(inffig_list
*ifl
)
75 void inf_resetinffig_state(inffig_list
*ifl
)
80 inffig_list
*getloadedinffig(char *name
)
86 if (INF_HT
==NULL
) INF_HT
=addht(16);
87 if ((l
=gethtitem(INF_HT
, name
))==EMPTYHT
) return NULL
;
88 return (inffig_list
*)l
;
91 inffig_list
*addinffig(char *name
)
97 if ((ifig
=getloadedinffig(name
))!=NULL
)
100 ifig
=(inffig_list
*)mbkalloc(sizeof(inffig_list
));
104 addhtitem(INF_HT
, name
, (long)ifig
);
106 memset(&ifig
->DEFAULT
, 0, sizeof(INF_INFOSET
));
107 memset(&ifig
->LOADED
, 0, sizeof(INF_INFOSET
));
111 void inf_renameinffig(char *orig
, char *newname
)
115 if ((ifl
=getloadedinffig(orig
))!=NULL
)
117 delhtitem(INF_HT
, ifl
->NAME
);
118 ifl
->NAME
=namealloc(newname
);
119 delinffig(ifl
->NAME
);
120 addhtitem(INF_HT
, ifl
->NAME
, (long)ifl
);
124 void infclone(char *name
, inffig_list
*ifig
)
126 name
=namealloc(name
);
128 if (ifig
==NULL
) return;
130 addhtitem(INF_HT
, name
, (long)ifig
);
133 void delinffig(char *name
)
136 chain_list
*all
, *cl
;
138 name
=namealloc(name
);
140 if ((ifig
=getloadedinffig(name
))!=NULL
)
142 // pour etre sure d'eliminer tous les clones pointant
143 // sur la meme inffig
144 all
=GetAllHTKeys(INF_HT
);
145 for (cl
=all
; cl
!=NULL
; cl
=cl
->NEXT
)
147 if (gethtitem(INF_HT
, cl
->DATA
)==(long)ifig
)
148 delhtitem(INF_HT
, cl
->DATA
);
153 infClean(ifig
, INF_LOADED_LOCATION
);
154 if (ifig
->LOADED
.REGISTRY
!=NULL
) delht(ifig
->LOADED
.REGISTRY
);
155 infClean(ifig
, INF_DEFAULT_LOCATION
);
156 if (ifig
->DEFAULT
.REGISTRY
!=NULL
) delht(ifig
->DEFAULT
.REGISTRY
);
157 freeptype(ifig
->USER
);
159 // delhtitem(INF_HT, name);
163 inffig_list
*getinffig(char *name
)
168 if ((ifl
=getloadedinffig(name
))==NULL
169 || (pt
=getptype(ifl
->USER
, INF_IS_DIRTY
))!=NULL
170 || getptype(ifl
->USER
,INF_LOADED_FROM_DISK
)==NULL
173 ifl
=infRead(name
, 1);
174 // if (pt!=NULL && ifl!=NULL) ifl->USER=delptype(ifl->USER, INF_IS_DIRTY);
180 static chain_list
*Hidden
=NULL
;
182 static int countwild(char *val
)
185 for (i
=0;val
[i
]!='\0';i
++) if (val
[i
]!='*') cnt
++;
188 static int infsortnames(const void *a0
, const void *b0
)
190 char *a
=*(char **)a0
, *b
=*(char **)b0
;
194 if (strcmp(a
,"default")==0)
199 if (strcmp(b
,"default")==0)
204 if (ca
>cb
) return -1;
209 chain_list
*inf_SortEntries(chain_list
*cl
)
215 tab
=mbkalloc(sizeof(char *)*nb
);
216 for (i
=0, ch
=cl
;i
<nb
; ch
=ch
->NEXT
, i
++) tab
[i
]=(char *)ch
->DATA
;
218 qsort(tab
, nb
, sizeof(char *), infsortnames
);
220 for (i
=0, ch
=cl
;i
<nb
; ch
=ch
->NEXT
, i
++) ch
->DATA
=tab
[i
];
225 void inf_PushAndHideInf(char *name
)
229 if ((ifl
=getloadedinffig(name
))!=NULL
)
231 delhtitem(INF_HT
, ifl
->NAME
);
232 Hidden
=addchain(Hidden
, ifl
);
235 Hidden
=addchain(Hidden
, NULL
);
244 ifl
=(inffig_list
*)Hidden
->DATA
;
245 if (ifl
!=NULL
) addhtitem(INF_HT
, ifl
->NAME
, (long)ifl
);
246 Hidden
=delchain(Hidden
, Hidden
);
250 void inf_Dirty(char *name
)
252 chain_list
*cl
, *all
;
255 all
=GetAllHTElems(INF_HT
);
258 if ((ifl
=getloadedinffig(name
))!=NULL
)
259 all
=addchain(NULL
, ifl
);
263 for (cl
=all
; cl
!=NULL
; cl
=cl
->NEXT
)
265 ifl
=(inffig_list
*)cl
->DATA
;
266 infClean(ifl
, INF_LOADED_LOCATION
);
267 if (getptype(ifl
->USER
, INF_IS_DIRTY
)==NULL
)
268 ifl
->USER
=addptype(ifl
->USER
, INF_IS_DIRTY
, NULL
);
275 inffig_list
*_infRead(char *figname
, char *filename
, char silent
)
277 static int vierge
= 1 ;
281 sprintf (buf
, "%s", filename
);
284 // if (vierge == 0) infclean();
285 infin
= mbkfopen(filename
, NULL
, READ_TEXT
);
289 if (vierge
== 0) infrestart(infin
) ;
293 infname
=namealloc(figname
);
297 if (INFDISPLAYLOAD
) avt_error("inf", -1, AVT_INFO
, "loading '%s' ... %s\n", filename
, INF_ERROR
?"failed":"ok");
298 if ((silent
& INF_DONTLOG
)==0 && AVTLOGFILE
!=NULL
)
301 fprintf(AVTLOGFILE
, ">>>> STATE OF INF FOR FIGURE '%s' AFTER READING FILE '%s'\n\n", INF_FIG
==NULL
||inf_ignorename
?infname
:INF_FIG
->NAME
, filename
);
302 if (INF_FIG
!=NULL
) infDrive(INF_FIG
, NULL
, INF_LOADED_LOCATION
|INF_DEFAULT_LOCATION
, AVTLOGFILE
);
303 fprintf(AVTLOGFILE
, "\n<<<<\n\n");
305 avt_log(LOGCONFIG
, 1, "Loading information file '%s' for figure '%s'\n", filename
, INF_FIG
==NULL
||inf_ignorename
?infname
:INF_FIG
->NAME
);
307 infin
= mbkfopen(filename
, NULL
, READ_TEXT
);
310 mbk_dumpfile(infin
, AVTLOGFILE
, 9);
314 avt_log(LOGCONFIG
, 1, " -- Current information taken from inf file --\n");
315 inf_set_print_mode(1);
316 infDrive (INF_FIG
, "dummy", INF_LOADED_LOCATION
, AVTLOGFILE
);
317 inf_set_print_mode(0);
318 avt_log(LOGCONFIG
, 1, " -- End --\n");
322 return INF_FIG
;//getloadedinffig(namealloc(filename));
326 avt_errmsg(INF_ERRMSG
, "012", AVT_WARNING
, filename
);
327 // avt_error("inf", 1, AVT_WAR, "can not open '%s' information file\n", filename);
331 static chain_list
*inf_split(char *varname
)
338 str
=avt_gethashvar(varname
);
342 l
=strtok_r(buf
, ",", &tmp
);
345 cl
=addchain(cl
, mbkstrdup(l
));
346 l
=strtok_r(NULL
, ",", &tmp
);
352 static void inf_freechain(chain_list
*cl
)
355 for (ch
=cl
; ch
!=NULL
; ch
=ch
->NEXT
)
361 char *inf_GetDefault_AVT_INF_Value()
363 if (mbk_GetREGEXMODE()=='C')
364 return "$\\.spice\\.inf,$\\.sdc\\.inf,$\\.inf";
366 return "$.spice.inf,$.sdc.inf,$.inf";
369 inffig_list
*infRead(char *name
, char silent
)
371 chain_list
*regx
, *files
, *cl
;
374 regx
=inf_split("AVT_INF");
375 if (regx
==NULL
) return getloadedinffig(namealloc(name
));
377 files
=BuildFileList(name
, regx
, 0);
381 if (!(files
!=NULL
&& files
->NEXT
==NULL
&& strcasecmp(files
->DATA
, "no")==0))
383 for (cl
=files
; cl
!=NULL
; cl
=cl
->NEXT
)
385 ifl
=_infRead(name
, (char *)cl
->DATA
, silent
);
388 inf_freechain(files
);
389 return getloadedinffig(namealloc(name
));
394 static void double_list_clean(chain_list **ch)
397 for (ptchain = *ch; ptchain; ptchain = ptchain->NEXT) {
398 freechain((chain_list *)ptchain->DATA);
404 static void ptype_list_clean(chain_list
**ch
)
407 for (ptchain
= *ch
; ptchain
; ptchain
= ptchain
->NEXT
) {
408 freeptype((ptype_list
*)ptchain
->DATA
);
414 void infClean(inffig_list
*ifl
, int location
)
418 if (location
==INF_DEFAULT_LOCATION
)
423 ptype_list_clean(&is
->INF_FALSEPATH
);
424 ptype_list_clean(&is
->INF_FALSESLACK
);
426 infCleanRegistry(ifl
, location
);
429 static chain_list
*merge_chain(chain_list
*first
, chain_list
*second
, int checkdup
)
431 chain_list
*res
, *cl
;
434 for (cl
=first
; cl
!=NULL
; cl
=cl
->NEXT
) res
=addchain(res
, cl
->DATA
);
439 for (cl
=first
; cl
!=NULL
; cl
=cl
->NEXT
)
440 if (cl
->DATA
==second
->DATA
) break;
445 res
=addchain(res
, second
->DATA
);
451 static chain_list *merge_ptype(ptype_list *first, ptype_list *second, int checkdup)
457 for (cl=first; cl!=NULL; cl=cl->NEXT) res=addchain(res, cl);
462 for (cl=first; cl!=NULL; cl=cl->NEXT)
463 if (cl->DATA==second->DATA) break;
468 res=addchain(res, second);
474 static chain_list
*merge_siglist(list_list
*first
, list_list
*second
, int checkdup
)
480 for (icl
=first
; icl
!=NULL
; icl
=icl
->NEXT
) res
=addchain(res
, icl
);
486 for (icl
=first
; icl
!=NULL
; icl
=icl
->NEXT
)
487 if(icl
->DATA
==second
->DATA
&& icl
->TYPE
==second
->TYPE
) break;
492 res
=addchain(res
, second
);
498 chain_list
*infGetInfo(inffig_list
*myfig
, int type
)
500 if (myfig
==NULL
) return NULL
;
503 case INF_FALSEPATH_INFO
: return merge_chain(myfig
->LOADED
.INF_FALSEPATH
, myfig
->DEFAULT
.INF_FALSEPATH
, 0);
504 case INF_SIGLIST_INFO
: return merge_siglist(myfig
->LOADED
.INF_SIGLIST
, myfig
->DEFAULT
.INF_SIGLIST
, 1);
510 int infHasInfo(inffig_list
*myfig
, int type
)
512 if (myfig
==NULL
) return 0;
515 case INF_FALSEPATH_INFO
: return myfig
->LOADED
.INF_FALSEPATH
!=NULL
|| myfig
->DEFAULT
.INF_FALSEPATH
!=NULL
;
516 case INF_SIGLIST_INFO
: return myfig
->LOADED
.INF_SIGLIST
!=NULL
|| myfig
->DEFAULT
.INF_SIGLIST
!=NULL
;
523 /***********************************************************************
524 * fonction inf_GetList(); *
525 **********************************************************************/
526 list_list
*inf_GetList (inffig_list
*myfig
, char *name
, long type
)
529 chain_list
*cl
, *maincl
;
531 maincl
=infGetInfo(myfig
, INF_SIGLIST_INFO
);
533 for (cl
=maincl
; cl
!=NULL
; cl
=cl
->NEXT
)
535 list
=(list_list
*)cl
->DATA
;
536 if (list
->DATA
==name
&& list
->TYPE
==type
) return list
;
544 /***********************************************************************
545 * fonction infAddList(); *
546 **********************************************************************/
547 list_list
*infAddList(inffig_list
*ifl
, int location
, char *data
,long level
,char prg
, void *user
, char *where
)
549 list_list
*list
, *endlist
= NULL
, *indefault
;
551 INF_INFOSET
*addlist
;
553 if (location
==INF_LOADED_LOCATION
)
555 for(indefault
= ifl
->DEFAULT
.INF_SIGLIST
; indefault
!= NULL
; indefault
= indefault
->NEXT
)
556 if(indefault
->DATA
==data
&& indefault
->TYPE
==level
) break;
558 addlist
=&ifl
->LOADED
;
562 addlist
=&ifl
->DEFAULT
;
566 for(list
= addlist
->INF_SIGLIST
; list
!= NULL
; list
= list
->NEXT
)
568 if((list
->DATA
== data
) && (list
->TYPE
== level
))
574 if((flag
!= 0) && (prg
!= 't'))
576 avt_errmsg(INF_ERRMSG
, "013", AVT_WARNING
, where
==NULL
?"":where
, data
);
577 // avt_error("inf", 2, AVT_WAR, "%sinformation on signal %s already read -- ignored\n",where==NULL?"":where, data);
583 avt_errmsg(INF_ERRMSG
, "014", AVT_WARNING
, where
==NULL
?"":where
, data
);
584 // avt_error("inf", 3, AVT_WAR, "%sinformation on signal '%s' has already been set elsewhere -- overriding with inf values\n",where==NULL?"":where, data);
587 list
= mbkalloc(sizeof(struct list
)) ;
592 list
->NEXT
= addlist
->INF_SIGLIST
;
593 addlist
->INF_SIGLIST
=list
;
599 list_list
*infaddll(list_list
*head
, void *data
, long level
, ptype_list
*user
)
601 list_list
*list
, *last
;
602 list
= mbkalloc(sizeof(list_list
)) ;
608 for (last
=head
; last
!=NULL
&& last
->NEXT
!=NULL
; last
=last
->NEXT
) ;
618 void inffreell(list_list
*ptlist
)
620 list_list
*ptnextlist
;
623 ptnextlist
= ptlist
->NEXT
;
629 static void inffreedatavalue(InfValue
*iv
)
631 if (iv
->datatype
=='s' && iv
->VAL
.string
!=NULL
) mbkfree(iv
->VAL
.string
);
632 else if (iv
->datatype
=='p')
634 if (strcasecmp(iv
->pointertype
, INF_SPECIN
)==0)
635 inf_stb_parse_spec_free((inf_stb_p_s
*)iv
->VAL
.pointer
);
636 else if (strcasecmp(iv
->pointertype
, INF_ASSOCLIST
)==0)
639 for (cl
=(chain_list
*)iv
->VAL
.pointer
; cl
!=NULL
; cl
=cl
->NEXT
)
641 freechain((chain_list
*)iv
->VAL
.pointer
);
643 else if (strcasecmp(iv
->pointertype
, INF_MISCDATA
)==0)
645 mbkfree(iv
->VAL
.pointer
);
650 static void inffreevalue(InfValue
*iv
)
652 inffreedatavalue(iv
);
656 static InfValue
*infcreateentrydata(char *type
, char datatype
)
660 iv
=(InfValue
*)mbkalloc(sizeof(InfValue
));
661 iv
->infotype
=type
; //sensitive_namealloc(type);
662 iv
->datatype
=datatype
;
668 static InfValue
*infgetentrydata(chain_list
*cl
, char *type
)
670 while (cl
!=NULL
&& ((InfValue
*)cl
->DATA
)->infotype
!=type
) cl
=cl
->NEXT
;
671 if (cl
==NULL
) return NULL
;
672 return (InfValue
*)cl
->DATA
;
675 static chain_list
*infgetvals(INF_INFOSET
*is
, char *key
)
678 if (is
->REGISTRY
==NULL
) return NULL
;
679 if ((l
=gethtitem(is
->REGISTRY
, key
))!=EMPTYHT
) return (chain_list
*)l
;
683 static InfValue
*infgetorcreatekey(INF_INFOSET
*is
, char *key
, char *type
, char datatype
)
689 vals
=infgetvals(is
, key
);
690 if ((iv
=infgetentrydata(vals
, type
))==NULL
)
692 if (is
->REGISTRY
==NULL
) is
->REGISTRY
=addht(16);
693 iv
=infcreateentrydata(type
, datatype
);
694 if (datatype
=='s') iv
->VAL
.string
=NULL
;
695 else if (datatype
=='p') iv
->VAL
.pointer
=NULL
;
696 vals
=addchain(vals
, iv
);
697 addhtitem(is
->REGISTRY
, key
, (long)vals
);
702 static InfValue
*infgetkey(INF_INFOSET
*is
, char *key
, char *type
)
708 vals
=infgetvals(is
, key
);
709 iv
=infgetentrydata(vals
, type
);
714 inf_assoc
*inf_createassoc()
717 assoc
=(inf_assoc
*)mbkalloc(sizeof(inf_assoc
));
720 inf_miscdata
*inf_createmiscdata()
723 assoc
=(inf_miscdata
*)mbkalloc(sizeof(inf_miscdata
));
727 void inf_AddString(inffig_list
*ifl
, int location
, char *key
, char *type
, char *val
, char *where
)
732 if (ifl
==NULL
) return;
733 type
=sensitive_namealloc(type
);
734 if (location
==INF_DEFAULT_LOCATION
)
739 if ((iv
=infgetkey(&ifl
->DEFAULT
, key
, type
))!=NULL
)
741 if (iv
->VAL
.string
==NULL
|| val
==NULL
)
743 if (val
!=iv
->VAL
.string
) sayit
=1;
745 else if (strcmp(iv
->VAL
.string
, val
)!=0) sayit
=1;
747 avt_errmsg(INF_ERRMSG
, "015", AVT_WARNING
, where
==NULL
?"":where
, type
, key
, iv
->VAL
.string
, val
);
748 // avt_error("inf", 3, AVT_WAR, "%sinformation '%s' for '%s' has already been set to '%s' elsewhere -- overriding with inf value '%s'\n",where==NULL?"":where, type, key, iv->VAL.string, val);
752 iv
=infgetorcreatekey(is
, key
, type
, 's');
753 inffreedatavalue(iv
);
754 if (val
!=NULL
) iv
->VAL
.string
=mbkstrdup(val
);
755 else iv
->VAL
.string
=NULL
;
759 void inf_AddPointer(inffig_list
*ifl
, int location
, char *key
, char *type
, char *pointertype
, void *val
, char *where
)
763 if (ifl
==NULL
) return;
764 type
=sensitive_namealloc(type
);
765 if (location
==INF_DEFAULT_LOCATION
)
770 if (infgetkey(&ifl
->DEFAULT
, key
, type
)!=NULL
)
771 avt_errmsg(INF_ERRMSG
, "016", AVT_WARNING
, where
==NULL
?"":where
, type
, key
);
772 // avt_error("inf", 3, AVT_WAR, "%sinformation '%s' for '%s' has already been set elsewhere -- overriding with inf values\n",where==NULL?"":where, type, key);
775 iv
=infgetorcreatekey(is
, key
, type
, 'p');
776 iv
->pointertype
=pointertype
;
777 // inffreedatavalue(iv);
778 // if (val!=NULL) iv->VAL.string=mbkstrdup(val);
783 void inf_AddMiscData(inffig_list
*ifl
, int location
, char *key
, char *type
, char *val0
, char *val1
, long lval
, double dval
, double dval1
, char *where
)
789 if (ifl
==NULL
) return;
790 type
=sensitive_namealloc(type
);
791 if (location
==INF_DEFAULT_LOCATION
)
796 if (infgetkey(&ifl
->DEFAULT
, key
, type
)!=NULL
)
797 avt_errmsg(INF_ERRMSG
, "016", AVT_WARNING
, where
==NULL
?"":where
, type
, key
);
798 // avt_error("inf", 3, AVT_WAR, "%sinformation '%s' for '%s' has already been set elsewhere -- overriding with inf values\n",where==NULL?"":where, type, key);
801 iv
=infgetorcreatekey(is
, key
, type
, 'p');
802 iv
->pointertype
=INF_MISCDATA
;
803 if (iv
->VAL
.pointer
==NULL
)
805 assoc
=inf_createmiscdata();
806 iv
->VAL
.pointer
=assoc
;
809 assoc
=iv
->VAL
.pointer
;
819 void inf_AddDouble(inffig_list
*ifl
, int location
, char *key
, char *type
, double val
, char *where
)
823 if (ifl
==NULL
) return;
824 type
=sensitive_namealloc(type
);
825 if (location
==INF_DEFAULT_LOCATION
)
830 /* if ((iv=infgetkey(&ifl->DEFAULT, key, type))!=NULL && fabs(iv->VAL.dvalue-val)>1e-13)
831 avt_error("inf", 3, AVT_WAR, "%sinformation '%s' for '%s' has already been set to %g elsewhere -- overriding with inf value %g\n",where==NULL?"":where, type, key, iv->VAL.dvalue, val);*/
833 iv
=infgetorcreatekey(is
, key
, type
, 'd');
839 void inf_AddInt(inffig_list
*ifl
, int location
, char *key
, char *type
, int val
, char *where
)
843 if (ifl
==NULL
) return;
844 type
=sensitive_namealloc(type
);
845 if (location
==INF_DEFAULT_LOCATION
)
850 if ((iv
=infgetkey(&ifl
->DEFAULT
, key
, type
))!=NULL
&& iv
->VAL
.ivalue
!=val
)
851 avt_errmsg(INF_ERRMSG
, "017", AVT_WARNING
, where
==NULL
?"":where
, type
, key
, iv
->VAL
.ivalue
, val
);
852 // avt_error("inf", 3, AVT_WAR, "%sinformation '%s' for '%s' has already been set to %d elsewhere -- overriding with inf value %d\n",where==NULL?"":where, type, key, iv->VAL.ivalue, val);
854 iv
=infgetorcreatekey(is
, key
, type
, 'i');
859 int inf_GetString(inffig_list
*ifl
, char *key
, char *type
, char **val
)
862 if (ifl
==NULL
) return 0;
863 type
=sensitive_namealloc(type
);
864 if ((STUCK_SECTION
& INF_LOADED_LOCATION
)!=0) iv
=infgetkey(&ifl
->LOADED
, key
, type
);
865 if (iv
==NULL
|| iv
->datatype
!='s')
867 if ((STUCK_SECTION
& INF_DEFAULT_LOCATION
)!=0) iv
=infgetkey(&ifl
->DEFAULT
, key
, type
);
868 if (iv
==NULL
|| iv
->datatype
!='s')
875 int inf_GetPointer(inffig_list
*ifl
, char *key
, char *type
, void **val
)
878 if (ifl
==NULL
) return 0;
879 type
=sensitive_namealloc(type
);
880 if ((STUCK_SECTION
& INF_LOADED_LOCATION
)!=0) iv
=infgetkey(&ifl
->LOADED
, key
, type
);
881 if (iv
==NULL
|| iv
->datatype
!='p')
883 if ((STUCK_SECTION
& INF_DEFAULT_LOCATION
)!=0) iv
=infgetkey(&ifl
->DEFAULT
, key
, type
);
884 if (iv
==NULL
|| iv
->datatype
!='p')
887 *val
=iv
->VAL
.pointer
;
891 int inf_GetDouble(inffig_list
*ifl
, char *key
, char *type
, double *val
)
894 if (ifl
==NULL
) return 0;
895 type
=sensitive_namealloc(type
);
896 if ((STUCK_SECTION
& INF_LOADED_LOCATION
)!=0) iv
=infgetkey(&ifl
->LOADED
, key
, type
);
897 if (iv
==NULL
|| iv
->datatype
!='d')
899 if ((STUCK_SECTION
& INF_DEFAULT_LOCATION
)!=0) iv
=infgetkey(&ifl
->DEFAULT
, key
, type
);
900 if (iv
==NULL
|| iv
->datatype
!='d')
907 int inf_GetInt(inffig_list
*ifl
, char *key
, char *type
, int *val
)
910 if (ifl
==NULL
) return 0;
911 type
=sensitive_namealloc(type
);
912 if ((STUCK_SECTION
& INF_LOADED_LOCATION
)!=0) iv
=infgetkey(&ifl
->LOADED
, key
, type
);
913 if (iv
==NULL
|| iv
->datatype
!='i')
915 if ((STUCK_SECTION
& INF_DEFAULT_LOCATION
)!=0) iv
=infgetkey(&ifl
->DEFAULT
, key
, type
);
916 if (iv
==NULL
|| iv
->datatype
!='i')
923 chain_list
*inf_GetEntriesByType(inffig_list
*ifl
, char *type
, char *val
)
925 chain_list
*cl
, *all
, *ret
=NULL
;
929 if (ifl
==NULL
) return NULL
;
931 type
=sensitive_namealloc(type
);
934 if ((STUCK_SECTION
& INF_LOADED_LOCATION
)!=0 && ifl
->LOADED
.REGISTRY
!=NULL
)
936 all
=GetAllHTKeys(ifl
->LOADED
.REGISTRY
);
937 for (cl
=all
; cl
!=NULL
; cl
=cl
->NEXT
)
939 iv
=infgetkey(&ifl
->LOADED
, (char*)cl
->DATA
, type
);
940 if (type
==NULL
|| (iv
!=NULL
&& (val
==INF_ANY_VALUES
|| (iv
->datatype
=='s' && strcmp(iv
->VAL
.string
, val
)==0) || (iv
->datatype
=='i' && iv
->VAL
.ivalue
==(int)(long)val
))))
942 ret
=addchain(ret
, (char*)cl
->DATA
);
943 addhtitem(tempht
, (char*)cl
->DATA
, 0);
949 if ((STUCK_SECTION
& INF_DEFAULT_LOCATION
)!=0 && ifl
->DEFAULT
.REGISTRY
!=NULL
)
951 all
=GetAllHTKeys(ifl
->DEFAULT
.REGISTRY
);
952 for (cl
=all
; cl
!=NULL
; cl
=cl
->NEXT
)
954 if (gethtitem(tempht
, (char*)cl
->DATA
)==EMPTYHT
)
956 iv
=infgetkey(&ifl
->DEFAULT
, (char*)cl
->DATA
, type
);
957 if (type
==NULL
|| (iv
!=NULL
&& (val
==INF_ANY_VALUES
|| (iv
->datatype
=='s' && strcmp(iv
->VAL
.string
, val
)==0) || (iv
->datatype
=='i' && iv
->VAL
.ivalue
==(int)(long)val
))))
959 ret
=addchain(ret
, (char*)cl
->DATA
);
967 return inf_SortEntries(ret
);
970 chain_list
*inf_GetValuesByType(inffig_list
*ifl
, char *type
)
972 chain_list
*cl
, *all
, *ret
=NULL
;
978 if (ifl
==NULL
|| type
==NULL
) return NULL
;
979 type
=sensitive_namealloc(type
);
981 CreateNameAllocator(127, &na
, 'n');
982 if ((STUCK_SECTION
& INF_LOADED_LOCATION
)!=0 && ifl
->LOADED
.REGISTRY
!=NULL
)
984 all
=GetAllHTKeys(ifl
->LOADED
.REGISTRY
);
985 for (cl
=all
; cl
!=NULL
; cl
=cl
->NEXT
)
987 iv
=infgetkey(&ifl
->LOADED
, (char*)cl
->DATA
, type
);
988 if (iv
!=NULL
&& iv
->datatype
=='s')
990 nn
=NameAlloc(&na
, iv
->VAL
.string
);
991 if (gethtitem(tempht
, nn
)==EMPTYHT
)
993 ret
=addchain(ret
, iv
->VAL
.string
);
994 addhtitem(tempht
, nn
, 0);
996 addhtitem(tempht
, (char*)cl
->DATA
, 0);
1002 if ((STUCK_SECTION
& INF_DEFAULT_LOCATION
)!=0 && ifl
->DEFAULT
.REGISTRY
!=NULL
)
1004 all
=GetAllHTKeys(ifl
->DEFAULT
.REGISTRY
);
1005 for (cl
=all
; cl
!=NULL
; cl
=cl
->NEXT
)
1007 if (gethtitem(tempht
, (char*)cl
->DATA
)==EMPTYHT
)
1009 iv
=infgetkey(&ifl
->DEFAULT
, (char*)cl
->DATA
, type
);
1010 if (iv
!=NULL
&& iv
->datatype
=='s')
1012 nn
=NameAlloc(&na
, iv
->VAL
.string
);
1013 if (gethtitem(tempht
, nn
)==EMPTYHT
)
1015 ret
=addchain(ret
, iv
->VAL
.string
);
1016 addhtitem(tempht
, nn
, 0);
1023 DeleteNameAllocator(&na
);
1028 chain_list
*inf_GetLocatedEntriesByType(inffig_list
*ifl
, int location
, char *type
, char *val
)
1030 chain_list
*cl
, *all
, *ret
=NULL
;
1034 if (ifl
==NULL
) return NULL
;
1035 type
=sensitive_namealloc(type
);
1036 if (location
==INF_DEFAULT_LOCATION
)
1041 if (is
->REGISTRY
!=NULL
)
1043 all
=GetAllHTKeys(is
->REGISTRY
);
1044 for (cl
=all
; cl
!=NULL
; cl
=cl
->NEXT
)
1046 iv
=infgetkey(&ifl
->LOADED
, (char*)cl
->DATA
, type
);
1047 if (type
==NULL
|| (iv
!=NULL
&& (val
==NULL
|| (iv
->datatype
=='s' && strcmp(iv
->VAL
.string
, val
)==0) || (iv
->datatype
=='i' && iv
->VAL
.ivalue
==(int)(long)val
))))
1049 ret
=addchain(ret
, (char*)cl
->DATA
);
1057 void inf_RemoveKey(inffig_list
*ifl
, int location
, char *key
, char *type
)
1059 chain_list
*ret
=NULL
, *ch
, *prec
;
1062 if (ifl
==NULL
) return;
1063 type
=sensitive_namealloc(type
);
1064 if (location
==INF_DEFAULT_LOCATION
)
1069 if (is
->REGISTRY
==NULL
) return;
1071 ret
=infgetvals(is
, key
);
1074 for (ch
=ret
; ch
!=NULL
; ch
=ch
->NEXT
) inffreevalue((InfValue
*)ch
->DATA
);
1076 delhtitem(is
->REGISTRY
, key
);
1081 for (ch
=ret
; ch
!=NULL
; prec
=ch
, ch
=ch
->NEXT
)
1082 if (strcasecmp(((InfValue
*)ch
->DATA
)->infotype
, type
)==0) break;
1086 inffreevalue((InfValue
*)ch
->DATA
);
1087 if (prec
!=NULL
) prec
->NEXT
=ch
->NEXT
;
1088 else addhtitem(is
->REGISTRY
, key
, (long)ch
->NEXT
);
1096 static void infCleanRegistry(inffig_list
*ifl
, int location
)
1098 chain_list
*cl
, *all
;
1101 if (location
==INF_DEFAULT_LOCATION
)
1106 if (is
->REGISTRY
==NULL
) return;
1108 all
=GetAllHTKeys(is
->REGISTRY
);
1109 for (cl
=all
; cl
!=NULL
; cl
=cl
->NEXT
)
1111 inf_RemoveKey(ifl
, location
, (char*)cl
->DATA
, NULL
);
1117 static char *__getrel(char val
)
1119 if (val
==INF_STB_BEFORE
) return "before";
1120 if (val
==INF_STB_AFTER
) return "after";
1124 static char *__getstab(char val
)
1126 if (val
==INF_STB_STABLE
) return "stable";
1127 if (val
==INF_STB_UNSTABLE
) return "unstable";
1131 static char *__getedge(char val
)
1133 if (val
==INF_STB_RISING
) return "rising";
1134 if (val
==INF_STB_FALLING
) return "falling";
1135 if (val
==INF_STB_SLOPEALL
) return "(all)";
1142 /****************************************************************************/
1144 getVerificationLevel(char *token
)
1147 if (!strcmp(token
,INF_MUXU
)
1148 || !strcmp(token
,INF_MUXD
)
1149 || !strcmp(token
,INF_CMPU
)
1150 || !strcmp(token
,INF_CMPD
)
1151 || !strcmp(token
,INF_INPUTS
)
1152 || !strcmp(token
,INF_PIN_RISING_SLEW
)
1153 || !strcmp(token
,INF_PIN_FALLING_SLEW
)
1154 || !strcmp(token
,INF_PIN_LOW_VOLTAGE
)
1155 || !strcmp(token
,INF_PIN_HIGH_VOLTAGE
)
1156 || !strcmp(token
,INF_SLOPEIN
)
1157 || !strcmp(token
,INF_CAPAOUT
)
1158 || !strcmp(token
,INF_CAPAOUT_LW
)
1159 || !strcmp(token
,INF_CAPAOUT_L
)
1160 || !strcmp(token
,INF_OUTPUT_CAPACITANCE
)
1161 || !strcmp(token
,INF_ASYNCHRON
)
1162 || !strcmp(token
,INF_CONNECTOR_DIRECTION
)
1163 || !strcmp(token
,INF_SPECIN
)
1164 || !strcmp(token
,INF_SPECOUT
))
1167 if (!strcmp(token
,INF_STOP
)
1168 || !strcmp(token
,INF_DIROUT
)
1169 || !strcmp(token
,INF_CKLATCH
)
1170 || !strcmp(token
,INF_BREAK
)
1171 || !strcmp(token
,INF_RC
)
1172 || !strcmp(token
,INF_CLOCK_TYPE
)
1173 || !strcmp(token
,INF_MIN_RISE_TIME
)
1174 || !strcmp(token
,INF_MAX_RISE_TIME
)
1175 || !strcmp(token
,INF_MIN_FALL_TIME
)
1176 || !strcmp(token
,INF_MAX_FALL_TIME
)
1177 || !strcmp(token
,INF_CLOCK_PERIOD
))
1180 if (!strcmp(token
,INF_DLATCH
)
1181 || !strcmp(token
,INF_NOTLATCH
)
1182 || !strcmp(token
,INF_KEEP_TRISTATE_BEHAVIOUR
)
1183 || !strcmp(token
,INF_PRECHARGE
)
1184 || !strcmp(token
,INF_MODELLOOP
)
1185 || !strcmp(token
,INF_STRICT_SETUP
)
1186 || !strcmp(token
,INF_STUCK
)
1187 || !strcmp(token
,INF_BYPASS
)
1188 || !strcmp(token
,INF_INTER
)
1189 //|| token,INF_LL_PATHSIGS)
1190 || !strcmp(token
,INF_PATHIN
)
1191 || !strcmp(token
,INF_PATHOUT
)
1192 || !strncmp(token
,INF_PATHDELAYMARGINPREFIX
,strlen(INF_PATHDELAYMARGINPREFIX
))
1193 || !strcmp(token
,INF_NORISING
)
1194 || !strcmp(token
,INF_NOFALLING
)
1195 || !strcmp(token
,INF_NOCHECK
)
1196 || !strcmp(token
,INF_CROSSTALKMUXU
)
1197 || !strcmp(token
,INF_CROSSTALKMUXD
))
1200 if (!strcmp(token
,INF_IGNORE_INSTANCE
)
1201 || !strcmp(token
,INF_IGNORE_TRANSISTOR
)
1202 || !strcmp(token
,INF_IGNORE_CAPACITANCE
)
1203 || !strcmp(token
,INF_IGNORE_RESISTANCE
)
1204 || !strcmp(token
,INF_IGNORE_PARASITICS
)
1205 || !strcmp(token
,INF_IGNORE_NAMES
)
1206 || !strcmp(token
,INF_VERIF_STATE
)
1207 || !strcmp(token
,INF_ASYNC_CLOCK_GROUP
)
1208 || !strcmp(token
,INF_ASYNC_CLOCK_GROUP_PERIOD
)
1209 || !strcmp(token
,INF_EQUIV_CLOCK_GROUP
)
1210 || !strcmp(token
,INF_PREFERED_CLOCK
))
1216 /*}}}************************************************************************/
1220 /****************************************************************************/
1221 #define INF_VERIFICATION_LEVEL_MAX 50
1222 #define INF_VERIFICATION_DONE 10
1225 getNFillMinVerificationLevel(chain_list
*ch
, int b
)
1231 a
= getVerificationLevel(((InfValue
*)ch
->DATA
)->infotype
);
1234 printf(" OK \"%s\"\n",((InfValue *)ch->DATA)->infotype);
1236 printf(">>>> FAILED \"%s\"\n",((InfValue *)ch->DATA)->infotype);
1238 if ((a
== -1 && b
>= 0) || a
> b
)
1239 min
= getNFillMinVerificationLevel(ch
->NEXT
,b
);
1241 min
= getNFillMinVerificationLevel(ch
->NEXT
,a
);
1242 ((InfValue
*)ch
->DATA
)->match
= min
;
1247 if (b
== INF_VERIFICATION_LEVEL_MAX
)
1253 /*}}}************************************************************************/
1257 /****************************************************************************/
1259 markChecked(chain_list
*ch
, int level
)
1263 ((InfValue
*)ch
->DATA
)->match
= INF_VERIFICATION_DONE
+level
;
1264 markChecked(ch
->NEXT
, level
);
1268 /*}}}************************************************************************/
1272 /****************************************************************************/
1274 checkKeys(FILE * f
, char *key
,INF_INFOSET
*is
, int level
)
1279 ret
= infgetvals(is
, namealloc(key
));
1280 match
= ((InfValue
*)ret
->DATA
)->match
;
1283 match
= getNFillMinVerificationLevel(ret
,INF_VERIFICATION_LEVEL_MAX
);
1285 if ((match
< INF_VERIFICATION_DONE
&& match
== level
) || (match
>= INF_VERIFICATION_DONE
&& match
!=INF_VERIFICATION_DONE
-level
))
1288 f
=NULL
; // supress warning
1292 /*}}}************************************************************************/
1296 /****************************************************************************/
1298 markKeyChecked(char *key
,INF_INFOSET
*is
, int level
)
1302 ret
= infgetvals(is
, namealloc(key
));
1304 markChecked(ret
,level
);
1307 /*}}}************************************************************************/
1311 /****************************************************************************/
1313 checkSections(FILE *f
, inffig_list
*ifl
, char *token
, int level
, chain_list
*data
, ht
*sig_ht
)
1315 static ht
*th
= NULL
;
1316 chain_list
*keys
, *c1
, *cx
;
1322 if (th
!=NULL
) delht(th
);
1330 if (level
== 2 && (!strcmp(token
,INF_MUXU
)
1331 || !strcmp(token
,INF_MUXD
)
1332 || !strcmp(token
,INF_CMPU
)
1333 || !strcmp(token
,INF_CMPD
)
1334 || !strcmp(token
,INF_DISABLE_GATE_DELAY
)))
1336 if (!strcmp(token
,INF_DISABLE_GATE_DELAY
))
1337 keys
=grab_inf_assoc(ifl
, INF_DISABLE_GATE_DELAY
);
1339 keys
= grab_inf_Mutex(ifl
);
1341 for (c1
= keys
; c1
; c1
= c1
->NEXT
)
1344 st
= (char*)gethtitem(th
,c1
->DATA
);
1345 if (st
== (char*)EMPTYHT
)
1347 if (gethtitem(sig_ht
, c1
->DATA
)==EMPTYHT
)
1349 for (cx
= data
; cx
; cx
= cx
->NEXT
)
1351 /*st = (char*)gethtitem(th,cx->DATA);
1352 if (st != (char*)EMPTYHT && strchr((char *)c1->DATA,'*')==NULL)
1354 if (mbk_TestREGEX(cx
->DATA
,c1
->DATA
) || mbk_TestREGEX(mbk_vect(cx
->DATA
,'[',']'),c1
->DATA
))
1364 avt_errmsg(INF_ERRMSG
, "023", AVT_WARNING
, (char *)c1
->DATA
,level
==1?"connector":level
==2?"net":"cone");
1365 // avt_error("inf",-1,AVT_ERROR,"name '¤2%s¤.' doesn't match any signal in circuit\n",(char *)c1->DATA);
1366 addhtitem(th
,c1
->DATA
,done
);
1372 if (level
== 3 && (!strcmp(token
,INF_CROSSTALKMUXU
)
1373 || !strcmp(token
,INF_CROSSTALKMUXD
)))
1375 keys
= grab_inf_CrosstalkMutex(ifl
);
1377 for (c1
= keys
; c1
; c1
= c1
->NEXT
)
1380 st
= (char*)gethtitem(th
,c1
->DATA
);
1381 if (st
== (char*)EMPTYHT
)
1383 if (gethtitem(sig_ht
, c1
->DATA
)==EMPTYHT
)
1385 for (cx
= data
; cx
; cx
= cx
->NEXT
)
1387 if (mbk_TestREGEX(cx
->DATA
,c1
->DATA
) || mbk_TestREGEX(mbk_vect(cx
->DATA
,'[',']'),c1
->DATA
))
1397 avt_errmsg(INF_ERRMSG
, "023", AVT_WARNING
, (char *)c1
->DATA
,level
==1?"connector":level
==2?"net":"cone");
1398 // avt_error("inf",-1,AVT_ERROR,"%name '¤2%s¤.' doesn't match any signal in circuit\n",(char *)c1->DATA);
1399 addhtitem(th
,c1
->DATA
,done
);
1404 f
=NULL
; // supress warning
1407 /*}}}************************************************************************/
1410 /* level composition of data */
1411 /* I chain_list of pin name */
1412 /* II '' of signal name */
1413 /* III '' of cones name */
1415 /****************************************************************************/
1417 inf_CheckRegistry(FILE *f
, inffig_list
*ifl
, int level
, chain_list
*data
)
1419 chain_list
*cl
, *cx
, *all
;
1423 static int init
= 0;
1428 case 1: avt_log(LOGCONFIG
, 0, "Check level I (connectors)"); break;
1429 case 2: avt_log(LOGCONFIG
, 0, "Check level II (nets)"); break;
1430 case 3: avt_log(LOGCONFIG
, 0, "Check level III (cones)"); break;
1432 if (!V_BOOL_TAB
[__INF_CONF_CHECK
].VALUE
)
1434 avt_log(LOGCONFIG
, 0, " disabled\n");
1438 avt_log(LOGCONFIG
, 0, "\n");
1444 if (0==INF_DEFAULT_LOCATION
)
1449 if (is
->REGISTRY
==NULL
)
1453 for (cx
= data
; cx
; cx
= cx
->NEXT
) addhtitem(sig_ht
, cx
->DATA
, 0);
1455 all
= GetAllHTKeys(is
->REGISTRY
);
1458 for (cl
=all
; cl
!=NULL
; cl
=cl
->NEXT
)
1459 if ((key
= (char*)cl
->DATA
) && strcasecmp(key
,"default"))
1462 /* checkSections(f,ifl,key,level,data);
1464 checkKeys(f
,key
,is
,level
);
1467 for (cl
=all
; cl
!=NULL
; cl
=cl
->NEXT
)
1470 key
= (char*)cl
->DATA
;
1471 if (strcasecmp(key
,"default"))
1474 checkSections(f
,ifl
,key
,level
,data
,sig_ht
);
1475 else if (checkKeys(f
,key
,is
,level
))
1477 if (gethtitem(sig_ht
, key
)!=EMPTYHT
)
1480 for (cx
= data
; cx
; cx
= cx
->NEXT
)
1482 if (mbk_TestREGEX(cx
->DATA
,key
) || mbk_TestREGEX(mbk_vect(cx
->DATA
,'[',']'),key
))
1485 markKeyChecked(key
,is
,level
);
1491 avt_errmsg(INF_ERRMSG
, "023", AVT_WARNING
, key
,level
==1?"connector":level
==2?"net":"cone");
1492 // avt_error("inf",-1,AVT_ERROR,"name '¤2%s¤.' doesn't match any signal in circuit\n",key);
1497 if (level
==2) checkSections(f
,ifl
,INF_DISABLE_GATE_DELAY
,level
,data
,sig_ht
);
1501 // reinitialisation au dernier level
1502 if (level
==3) checkSections(NULL
, NULL
, NULL
, 0, NULL
, NULL
);
1506 /*}}}************************************************************************/
1508 void inf_DumpRegistry (FILE *f
, inffig_list
*ifl
, int location
)
1510 chain_list
*cl
, *all
, *ret
, *ch
;
1515 if (ifl
==NULL
) return;
1517 if (location
==INF_DEFAULT_LOCATION
)
1522 if (is
->REGISTRY
==NULL
) return;
1524 all
=GetAllHTKeys(is
->REGISTRY
);
1525 for (cl
=all
; cl
!=NULL
; cl
=cl
->NEXT
)
1527 fprintf(f
, "key: \"%s\"\n",(char*)cl
->DATA
);
1528 ret
=infgetvals(is
, namealloc((char*)cl
->DATA
));
1529 for (ch
=ret
; ch
!=NULL
; ch
=ch
->NEXT
)
1531 iv
=(InfValue
*)ch
->DATA
;
1532 switch(iv
->datatype
)
1534 case 'i' : type
="int"; break;
1535 case 'd' : type
="real"; break;
1536 case 's' : type
="string"; break;
1537 case 'p' : type
="pointer"; break;
1538 default : type
="unknown";
1540 fprintf(f
, " item: \"%s\", type:%s, val: ",iv
->infotype
,type
);
1541 switch(iv
->datatype
)
1543 case 'i' : fprintf(f
, "%d\n", iv
->VAL
.ivalue
); break;
1544 case 'd' : fprintf(f
, "%g\n", iv
->VAL
.dvalue
); break;
1545 case 's' : fprintf(f
, "\"%s\"\n", iv
->VAL
.string
==NULL
?"NULL":iv
->VAL
.string
); break;
1548 // STB SPEC structure
1549 if (strcasecmp(iv
->pointertype
,INF_SPECIN
)==0)
1552 inf_stb_p_s_stab
*stab
;
1553 isps
=(inf_stb_p_s
*)iv
->VAL
.pointer
;
1557 fprintf(f
, " %s from \"%s\" %s\n", __getedge(isps
->DATAEDGE
)/*,isps->SPECTYPE*/, isps
->CKNAME
!=NULL
?isps
->CKNAME
:"null", __getedge(isps
->CKEDGE
));
1558 for (stab
=isps
->STABILITY
; stab
!=NULL
; stab
=stab
->NEXT
)
1560 if (stab
->CKNAME
==NULL
)
1563 fprintf(f
," %s ", __getstab(stab
->STABILITY
));
1564 for (cl
=stab
->TIME_LIST
; cl
!=NULL
; cl
=cl
->NEXT
)
1565 fprintf(f
," %g", *(double *)cl
->DATA
);
1570 fprintf(f
, " %s %g %s \"%s\" %s\n", __getstab(stab
->STABILITY
), stab
->DELAY
, __getrel(stab
->RELATIVITY
), stab
->CKNAME
!=NULL
?stab
->CKNAME
:"null", __getedge(stab
->CKEDGE
));
1577 // INF association list
1578 else if (strcasecmp(iv
->pointertype
,INF_ASSOCLIST
)==0)
1583 for (cl
=(chain_list
*)iv
->VAL
.pointer
; cl
!=NULL
; cl
=cl
->NEXT
)
1585 assoc
=(inf_assoc
*)cl
->DATA
;
1586 fprintf(f
, " \"%s\" \"%s\" lval:%ld dval:%g\n", assoc
->orig
!=NULL
?assoc
->orig
:"NULL", assoc
->dest
!=NULL
?assoc
->dest
:"NULL", assoc
->lval
, assoc
->dval
);
1589 else if (strcasecmp(iv
->pointertype
,INF_LISTOFLIST
)==0)
1591 chain_list
*cl
, *ch
;
1593 for (cl
=(chain_list
*)iv
->VAL
.pointer
; cl
!=NULL
; cl
=cl
->NEXT
)
1596 for (ch
=(chain_list
*)cl
->DATA
; ch
!=NULL
; ch
=ch
->NEXT
)
1597 fprintf(f
, " \"%s\"", (char *)ch
->DATA
);
1602 else if (strcasecmp(iv
->pointertype
,INF_MISCDATA
)==0)
1604 inf_miscdata
*assoc
;
1606 assoc
=(inf_miscdata
*)iv
->VAL
.pointer
;
1607 fprintf(f
, " \"%s\" \"%s\" lval:%ld dval:%g dval1:%g\n", assoc
->orig
!=NULL
?assoc
->orig
:"NULL", assoc
->dest
!=NULL
?assoc
->dest
:"NULL", assoc
->lval
, assoc
->dval
, assoc
->dval1
);
1610 fprintf(f
, "%p (%s)\n", iv
->VAL
.pointer
, iv
->pointertype
);
1613 default : fprintf(f
, "?\n");
1621 void inf_AddAssociation(inffig_list
*ifl
, int location
, char *key
, char *type
, char *val0
, char *val1
, long lval
, double dval
, char *where
)
1628 if (ifl
==NULL
) return;
1629 type
=sensitive_namealloc(type
);
1630 if (location
==INF_DEFAULT_LOCATION
)
1635 if (infgetkey(&ifl
->DEFAULT
, key
, type
)!=NULL
)
1636 avt_errmsg(INF_ERRMSG
, "016", AVT_WARNING
, where
==NULL
?"":where
, type
, key
);
1637 // avt_error("inf", 3, AVT_WAR, "%sinformation '%s' for '%s' has already been set elsewhere -- overriding with inf values\n",where==NULL?"":where, type, key);
1640 assoc
=inf_createassoc();
1645 iv
=infgetorcreatekey(is
, key
, type
, 'p');
1646 iv
->pointertype
=sensitive_namealloc(INF_ASSOCLIST
);
1647 old
=iv
->VAL
.pointer
;
1648 old
=append(old
, addchain(NULL
, assoc
));
1649 iv
->VAL
.pointer
=old
;
1653 void inf_AddList(inffig_list
*ifl
, int location
, char *key
, char *type
, chain_list
*val
, char *where
)
1659 if (ifl
==NULL
) return;
1660 type
=sensitive_namealloc(type
);
1661 if (location
==INF_DEFAULT_LOCATION
)
1666 if (infgetkey(&ifl
->DEFAULT
, key
, type
)!=NULL
)
1667 avt_errmsg(INF_ERRMSG
, "016", AVT_WARNING
, where
==NULL
?"":where
, type
, key
);
1668 // avt_error("inf", 3, AVT_WAR, "%sinformation '%s' for '%s' has already been set elsewhere -- overriding with inf values\n",where==NULL?"":where, type, key);
1671 iv
=infgetorcreatekey(is
, key
, type
, 'p');
1672 iv
->pointertype
=sensitive_namealloc(INF_LISTOFLIST
);
1673 old
=iv
->VAL
.pointer
;
1674 old
=append(old
, addchain(NULL
, val
));
1675 iv
->VAL
.pointer
=old
;
1679 static list_list
*inf_addsimplell(list_list
*ll
, inffig_list
*ifl
, char *infotype
, char *val
, long lltype
)
1681 chain_list
*lst
, *cl
;
1682 lst
=inf_GetEntriesByType(ifl
, infotype
, val
);
1683 for (cl
=lst
; cl
!=NULL
; cl
=cl
->NEXT
)
1685 ll
=infaddll(ll
, (char *)cl
->DATA
, lltype
, NULL
);
1692 list_list
*inf_create_INFSIGLIST(inffig_list
*ifl
)
1695 chain_list
*lst
, *cl
;
1699 if (ifl
==NULL
) return NULL
;
1702 for (tl
=ifl
->LOADED
.INF_SIGLIST
; tl
!=NULL
; tl
=tl
->NEXT
)
1704 ll
=infaddll(ll
, tl
->DATA
, tl
->TYPE
, tl
->USER
);
1707 lst
=inf_GetEntriesByType(ifl
, INF_STUCK
, INF_ANY_VALUES
);
1708 for (cl
=lst
; cl
!=NULL
; cl
=cl
->NEXT
)
1710 inf_GetInt(ifl
, (char *)cl
->DATA
, INF_STUCK
, &val
);
1711 if (val
==0) type
=INF_LL_STUCKVSS
;
1712 else type
=INF_LL_STUCKVDD
;
1713 ll
=infaddll(ll
, inf_reVectName((char *)cl
->DATA
), type
, NULL
);
1717 ll
=inf_addsimplell(ll
, ifl
, INF_PRECHARGE
, INF_YES
, INF_LL_PRECHARGE
);
1718 ll
=inf_addsimplell(ll
, ifl
, INF_PRECHARGE
, INF_NO
, INF_LL_NOTPRECHARGE
);
1720 ll
=inf_addsimplell(ll
, ifl
, INF_ASYNCHRON
, INF_ANY_VALUES
, INF_LL_ASYNCHRON
);
1722 ll
=inf_addsimplell(ll
, ifl
, INF_BYPASS
, INF_ALL
, INF_LL_BYPASS
);
1723 ll
=inf_addsimplell(ll
, ifl
, INF_BYPASS
, INF_IN
, INF_LL_BYPASSIN
);
1724 ll
=inf_addsimplell(ll
, ifl
, INF_BYPASS
, INF_OUT
, INF_LL_BYPASSOUT
);
1725 ll
=inf_addsimplell(ll
, ifl
, INF_BYPASS
, INF_ONLYEND
, INF_LL_ONLYEND
);
1727 ll
=inf_addsimplell(ll
, ifl
, INF_INTER
, INF_ANY_VALUES
, INF_LL_INTER
);
1729 ll
=inf_addsimplell(ll
, ifl
, INF_BREAK
, INF_ANY_VALUES
, INF_LL_BREAK
);
1730 ll
=inf_addsimplell(ll
, ifl
, INF_RC
, INF_YES
, INF_LL_RC
);
1731 ll
=inf_addsimplell(ll
, ifl
, INF_RC
, INF_NO
, INF_LL_NORC
);
1732 ll
=inf_addsimplell(ll
, ifl
, INF_NORISING
, INF_ANY_VALUES
, INF_LL_NORISING
);
1733 ll
=inf_addsimplell(ll
, ifl
, INF_NOFALLING
, INF_ANY_VALUES
, INF_LL_NOFALLING
);
1734 ll
=inf_addsimplell(ll
, ifl
, INF_FLIPFLOP
, INF_ANY_VALUES
, INF_LL_FLIPFLOP
);
1738 int inf_code_marksig(char *string
)
1744 strcpy(buf
, string
);
1746 tok
= strtok_r(buf
, " ,+", &c
);
1748 if (!strcasecmp("Latch",tok
) || !strcasecmp("net_Latch",tok
)) result
|= INF_NET_LATCH
;
1749 else if (!strcasecmp("MemSym",tok
) || !strcasecmp("net_MemSym",tok
)) result
|= INF_NET_MEMSYM
;
1750 else if (!strcasecmp("RS",tok
) || !strcasecmp("net_RS",tok
)) result
|= INF_NET_RS
;
1751 else if (!strcasecmp("FlipFlop",tok
) || !strcasecmp("net_FlipFlop",tok
)) result
|= INF_NET_FLIPFLOP
;
1752 else if (!strcasecmp("Master",tok
) || !strcasecmp("net_Master",tok
)) result
|= INF_NET_MASTER
;
1753 else if (!strcasecmp("Slave",tok
) || !strcasecmp("net_Slave",tok
)) result
|= INF_NET_SLAVE
;
1754 else if (!strcasecmp("Blocker",tok
) || !strcasecmp("net_Blocker",tok
)) result
|= INF_NET_BLOCKER
;
1755 else if (!strcasecmp("NoFalseBranch",tok
) || !strcasecmp("net_NoFalseBranch",tok
)) result
|= INF_NET_NOFALSEBRANCH
;
1756 else if (!strcasecmp("Vdd",tok
) || !strcasecmp("net_Vdd",tok
)) result
|= INF_NET_VDD
;
1757 else if (!strcasecmp("Vss",tok
) || !strcasecmp("net_Vss",tok
)) result
|= INF_NET_VSS
;
1758 else avt_errmsg(INF_ERRMSG
, "027", AVT_ERROR
, tok
);
1759 tok
= strtok_r(NULL
, " ,+", &c
);
1764 int inf_code_markRS(char *string
)
1766 if (!strcasecmp(string
,"illegal")) return INF_RS_ILLEGAL
;
1767 if (!strcasecmp(string
,"legal")) return INF_RS_LEGAL
;
1768 if (!strcasecmp(string
,"mark_only")) return INF_RS_MARKONLY
;
1769 avt_errmsg(INF_ERRMSG
, "027", AVT_ERROR
, string
);
1773 int inf_code_marktrans(char *string
)
1779 strcpy(buf
, string
);
1781 tok
= strtok_r(buf
, " ,+", &c
);
1783 if (!strcasecmp("Bleeder",tok
) || !strcasecmp("trans_Bleeder",tok
)) result
|= INF_TRANS_BLEEDER
;
1784 else if (!strcasecmp("Feedback",tok
) || !strcasecmp("trans_Feedback",tok
)) result
|= INF_TRANS_FEEDBACK
;
1785 else if (!strcasecmp("Command",tok
) || !strcasecmp("trans_Command",tok
)) result
|= INF_TRANS_COMMAND
;
1786 else if (!strcasecmp("NonFunctional",tok
) || !strcasecmp("trans_NonFunctional",tok
)) result
|= INF_TRANS_NOT_FUNCTIONAL
;
1787 else if (!strcasecmp("Blocker",tok
) || !strcasecmp("trans_Blocker",tok
)) result
|= INF_TRANS_BLOCKER
;
1788 else if (!strcasecmp("Short",tok
) || !strcasecmp("trans_Short",tok
)) result
|= INF_TRANS_SHORT
;
1789 else if (!strcasecmp("Unused",tok
) || !strcasecmp("trans_Unused",tok
)) result
|= INF_TRANS_UNUSED
;
1790 else avt_errmsg(INF_ERRMSG
, "027", AVT_ERROR
, tok
);
1791 tok
= strtok_r(NULL
, " ,+", &c
);
1796 void inf_buildmatchrule (inffig_list
* ifl
, char *section
, mbk_match_rules
* mr
, int canbenonnameallocated
)
1799 mbk_CreateREGEX (mr
, CASE_SENSITIVE
, canbenonnameallocated
);
1802 if (inf_GetPointer (ifl
, section
, "", (void **)&cl
)) {
1803 while (cl
!= NULL
) {
1804 mbk_AddREGEX (mr
, ((inf_assoc
*) cl
->DATA
)->orig
);
1810 cl
=inf_GetEntriesByType(ifl
, section
, INF_ANY_VALUES
);
1811 while (cl
!= NULL
) {
1812 mbk_AddREGEX (mr
, (char *)cl
->DATA
);