1 /****************************************************************************/
3 /* Chaine de CAO & VLSI Alliance */
5 /* Produit : GENIUS v1.00 */
6 /* Fichier : gen_main.c */
8 /* (c) copyright 1999 Laboratoire MASI equipe CAO & VLSI */
9 /* Tous droits reserves */
10 /* Support : e-mail alliance-support@asim.lip6.fr */
12 /* Auteur(s) : Francois DONNET le : 04/05/1999 */
14 /* Modifie par : le : ../../.... */
15 /* Modifie par : le : ../../.... */
16 /* Modifie par : le : ../../.... */
18 /****************************************************************************/
23 #include <sys/resource.h>
41 #include "gen_model_utils.h"
42 #include "gen_model_global.h"
43 #include "gen_verif_global.h"
44 #include "gen_search_global.h"
45 #include "gen_search_utils.h"
46 //#include "gen_corresp.h"
47 //#include "gen_search_utils.h"
48 #include "gen_new_kind.h"
50 #include "gen_display.h"
51 #include "gen_globals.h"
52 //#include "gen_corresp.h"
54 ht
*gns_create_template_hierarchy(lib_entry
*files_list
);
56 void SaveContext(GeniusContext
*GC
)
59 GC
->GEN_HEAD_LOFIG
=GEN_HEAD_LOFIG
; GEN_HEAD_LOFIG
=NULL
;
60 GC
->GEN_HT_LOFIG
=GEN_HT_LOFIG
; GEN_HT_LOFIG
=NULL
;
62 memcpy(&GC
->corresp_heap
, &corresp_heap
, sizeof(HeapAlloc
));
63 memcpy(&GC
->subinst_heap
, &subinst_heap
, sizeof(HeapAlloc
));
65 GC
->GENIUS_TO_SPY
=GENIUS_TO_SPY
; GENIUS_TO_SPY
=NULL
;
66 GC
->GENIUS_SPY
=GENIUS_SPY
; GENIUS_SPY
=NULL
;
69 GC
->GENIUS_LIB_NAME
=GENIUS_LIB_NAME
; GENIUS_LIB_NAME
=NULL
;
70 GC
->GENIUS_LIB_PATH
=GENIUS_LIB_PATH
; GENIUS_LIB_PATH
=NULL
;
71 GC
->GENIUS_TREE
=GENIUS_TREE
; GENIUS_TREE
=NULL
;
72 GC
->GENIUS_PRIORITY
=GENIUS_PRIORITY
; GENIUS_PRIORITY
=NULL
;
73 GC
->GENIUS_OUTPUT
=GENIUS_OUTPUT
; GENIUS_OUTPUT
=NULL
;
74 GC
->GEN_DEBUG_LEVEL
=GEN_DEBUG_LEVEL
; GEN_DEBUG_LEVEL
=0;
75 GC
->GEN_OPTIONS_PACK
=GEN_OPTIONS_PACK
; GEN_OPTIONS_PACK
=0;
76 GC
->genius_ec
=genius_ec
; genius_ec
=NULL
;
79 GC
->VAR_UNKNOWN
=VAR_UNKNOWN
; VAR_UNKNOWN
=0;
80 GC
->VAR_UNDEF
=VAR_UNDEF
; VAR_UNDEF
=0;
83 GC
->GEN_SEPAR
=GEN_SEPAR
; GEN_SEPAR
='.';
84 GC
->blocks_to_free
=blocks_to_free
; blocks_to_free
=NULL
;
85 GC
->HEAD_MODEL
=HEAD_MODEL
; HEAD_MODEL
=NULL
;
86 GC
->HEAD_MARK
=HEAD_MARK
; HEAD_MARK
=NULL
;
88 GC
->GENIUS_HEAD_LOFIG
=GENIUS_HEAD_LOFIG
; GENIUS_HEAD_LOFIG
=NULL
;
89 GC
->GENIUS_HT_LOFIG
=GENIUS_HT_LOFIG
; GENIUS_HT_LOFIG
=NULL
;
90 GC
->ModelTrace
=ModelTrace
; ModelTrace
=NULL
;
93 memcpy(&GC
->ea_heap
, &ea_heap
, sizeof(HeapAlloc
));
96 memcpy(&GC
->lcu_heap
, &lcu_heap
, sizeof(HeapAlloc
));
97 memcpy(&GC
->stat_heap
, &stat_heap
, sizeof(HeapAlloc
));
100 GC
->GENIUS_GLOBAL_LOFIG
=GENIUS_GLOBAL_LOFIG
;
102 // gen_search_utils.c
103 memcpy(GC
->tabs
, tabs
, 200); strcpy(tabs
,"");
104 GC
->current_lofig
=current_lofig
;
106 GC
->GEN_USER
=GEN_USER
;
107 GC
->NEW_LOINS_NAMES_HT
=NEW_LOINS_NAMES_HT
; NEW_LOINS_NAMES_HT
=NULL
;
108 GC
->LOINS_LIST_CONTROL
=LOINS_LIST_CONTROL
; LOINS_LIST_CONTROL
=NULL
;
109 GC
->ALL_KIND_OF_MODELS
=ALL_KIND_OF_MODELS
; ALL_KIND_OF_MODELS
=NULL
;
110 GC
->ALL_LOINS_FOUND
=ALL_LOINS_FOUND
; ALL_LOINS_FOUND
=NULL
;
111 GC
->CUR_HIER_LOFIG
=CUR_HIER_LOFIG
;
112 GC
->CUR_CORRESP_TABLE
=CUR_CORRESP_TABLE
;
113 memcpy(&GC
->all_loins_heap
, &all_loins_heap
, sizeof(HeapAlloc
));
114 memcpy(&GC
->loconmark_heap
, &loconmark_heap
, sizeof(HeapAlloc
));
117 memcpy(&GC
->swap_heap
, &swap_heap
, sizeof(HeapAlloc
));
118 GC
->radindexht
=radindexht
;
119 GC
->radtable
=radtable
;
120 GC
->curradindex
=curradindex
;
122 GC
->myallocs
=myallocs
;
124 memcpy(GC
->ALL_SYM_INFO
, ALL_SYM_INFO
, sizeof(biinfo
*)*MAX_SYMLIST
);
125 GC
->CUR_SYM_INDEX
=CUR_SYM_INDEX
;
127 memcpy(GC
->entry
, entry
, sizeof(struct localcash
)*CASHS
);
128 GC
->FOUND_MODEL
=FOUND_MODEL
;
130 GC
->TEMPLATE_HT
=GNS_TEMPLATE_HT
;
133 void RestoreContext(GeniusContext
*GC
)
136 GEN_HEAD_LOFIG
=GC
->GEN_HEAD_LOFIG
;
137 GEN_HT_LOFIG
=GC
->GEN_HT_LOFIG
;
138 // TRANS_TO_SUPPRESS=GC->TRANS_TO_SUPPRESS;
140 memcpy(&corresp_heap
, &GC
->corresp_heap
, sizeof(HeapAlloc
));
141 memcpy(&subinst_heap
, &GC
->subinst_heap
, sizeof(HeapAlloc
));
143 GENIUS_TO_SPY
=GC
->GENIUS_TO_SPY
;
144 GENIUS_SPY
=GC
->GENIUS_SPY
;
147 GENIUS_LIB_NAME
=GC
->GENIUS_LIB_NAME
;
148 GENIUS_LIB_PATH
=GC
->GENIUS_LIB_PATH
;
149 GENIUS_TREE
=GC
->GENIUS_TREE
;
150 GENIUS_PRIORITY
=GC
->GENIUS_PRIORITY
;
151 GENIUS_OUTPUT
=GC
->GENIUS_OUTPUT
;
152 GEN_DEBUG_LEVEL
=GC
->GEN_DEBUG_LEVEL
;
153 GEN_OPTIONS_PACK
=GC
->GEN_OPTIONS_PACK
;
154 genius_ec
=GC
->genius_ec
;
156 // gen_execute_VHDL.c
157 VAR_UNKNOWN
=GC
->VAR_UNKNOWN
;
158 VAR_UNDEF
=GC
->VAR_UNDEF
;
161 GEN_SEPAR
=GC
->GEN_SEPAR
;
162 blocks_to_free
=GC
->blocks_to_free
;
163 HEAD_MODEL
=GC
->HEAD_MODEL
;
164 HEAD_MARK
=GC
->HEAD_MARK
;
166 GENIUS_HEAD_LOFIG
=GC
->GENIUS_HEAD_LOFIG
;
167 GENIUS_HT_LOFIG
=GC
->GENIUS_HT_LOFIG
;
168 ModelTrace
=GC
->ModelTrace
;
171 memcpy(&ea_heap
, &GC
->ea_heap
, sizeof(HeapAlloc
));
174 memcpy(&lcu_heap
, &GC
->lcu_heap
, sizeof(HeapAlloc
));
175 memcpy(&stat_heap
, &GC
->stat_heap
, sizeof(HeapAlloc
));
177 //gen_search_global.c
178 GENIUS_GLOBAL_LOFIG
=GC
->GENIUS_GLOBAL_LOFIG
;
180 // gen_search_utils.c
181 memcpy(tabs
, GC
->tabs
, 200);
182 current_lofig
=GC
->current_lofig
;
184 GEN_USER
=GC
->GEN_USER
;
185 NEW_LOINS_NAMES_HT
=GC
->NEW_LOINS_NAMES_HT
;
186 LOINS_LIST_CONTROL
=GC
->LOINS_LIST_CONTROL
;
187 ALL_KIND_OF_MODELS
=GC
->ALL_KIND_OF_MODELS
;
188 ALL_LOINS_FOUND
=GC
->ALL_LOINS_FOUND
;
189 CUR_HIER_LOFIG
=GC
->CUR_HIER_LOFIG
;
190 CUR_CORRESP_TABLE
=GC
->CUR_CORRESP_TABLE
;
191 memcpy(&all_loins_heap
, &GC
->all_loins_heap
, sizeof(HeapAlloc
));
192 memcpy(&loconmark_heap
, &GC
->loconmark_heap
, sizeof(HeapAlloc
));
195 memcpy(&swap_heap
, &GC
->swap_heap
, sizeof(HeapAlloc
));
196 radindexht
=GC
->radindexht
;
197 radtable
=GC
->radtable
;
198 curradindex
=GC
->curradindex
;
200 myallocs
=GC
->myallocs
;
202 memcpy(ALL_SYM_INFO
, GC
->ALL_SYM_INFO
, sizeof(biinfo
*)*MAX_SYMLIST
);
203 CUR_SYM_INDEX
=GC
->CUR_SYM_INDEX
;
205 memcpy(entry
, GC
->entry
, sizeof(struct localcash
)*CASHS
);
206 FOUND_MODEL
=GC
->FOUND_MODEL
;
208 GNS_TEMPLATE_HT
=GC
->TEMPLATE_HT
;
213 static ht
*MAIN_HT_LOFIG
=NULL
;
214 static int GNS_RECURSION
=0;
216 lofig_list
*genius_getmainheadloadedlofig(char *name
)
219 if ((l
=gethtitem(MAIN_HT_LOFIG
, name
))==EMPTYHT
) return NULL
;
220 return (lofig_list
*)l
;
225 #define PRIME 211 /* undivisable number */
227 /* LEX&YACC functions parser */
228 /* from gen_tree_parser.yac */
229 extern tree_list
*Read_All(lib_entry
*);
231 extern void SearchInit();
232 extern void StatHeap_Manage(int mode
);
233 extern void SwapHeap_Manage(int mode
);
234 extern void LoconMarkHeap_Manage(int mode
);
235 extern void EAHeap_Manage(int mode
);
236 extern void LofigChainUpgradeHeap_Manage(int mode
);
237 extern void AllLoinsHeap_Manage(int mode
);
238 extern void CorrespHeap_Manage(int mode
);
240 typedef void (*heapfunc
)(int);
242 static heapfunc heapfuncs
[]=
246 LoconMarkHeap_Manage
,
248 LofigChainUpgradeHeap_Manage
,
253 static heapfunc heapfreefuncs
[]=
257 LoconMarkHeap_Manage
,
259 LofigChainUpgradeHeap_Manage
,
263 /****************************************************************************/
264 /* Parse from a LIBRARY files user's models and extract them from netlist */
265 /****************************************************************************/
267 static void gns_ordersignalnames(lofig_list
*lf
)
271 for (ls
=lf
->LOSIG
; ls
!=NULL
; ls
=ls
->NEXT
)
273 if (ls
->NAMECHAIN
!=NULL
&& ls
->NAMECHAIN
->NEXT
!=NULL
)
275 signame
=getsigname(ls
);
276 ls
->NAMECHAIN
=delchaindata(ls
->NAMECHAIN
, signame
);
277 ls
->NAMECHAIN
=addchain(ls
->NAMECHAIN
, signame
);
282 extern chain_list
* genius_main(lofig_list
*netlist
, char *cellib
, char *libname
, char *outname
)
285 ptype_list
*p
,*bi_list
;
286 chain_list
*fcl
=NULL
,*genius
=NULL
;
287 chain_list
*ret
, *ret2
;
289 lofig_list
*(*tmpfunc
)(char *name
);
291 mbkContext newcontext
;
295 #ifdef AVERTEC_LICENSE
296 if(avt_givetoken("YAGLE_LICENSE_SERVER", "gns")!=AVT_VALID_TOKEN
) EXIT(1) ;
299 gns_ordersignalnames(netlist
);
301 if (GNS_RECURSION
==0)
303 MAIN_HT_LOFIG
=HT_LOFIG
;
304 HOOK_GETLOADEDLOFIG
=genius_getmainheadloadedlofig
;
309 oldctx
=genius_external_getcontext();
310 newcontext
.HT_LOFIG
=HT_LOFIG
;
311 newcontext
.HEAD_LOFIG
=HEAD_LOFIG
;
312 genius_external_setcontext(&newcontext
);
314 /* init environment */
315 genius_env(netlist
, cellib
, libname
);
319 genius_ec
=APINewExecutionContext();
321 // initialisation des heaps
322 for (err
=0; err
<(signed)(sizeof(heapfuncs
)/sizeof(*heapfuncs
)); err
++)
325 GENIUS_HEAD_LOFIG
=GEN_HEAD_LOFIG
; GENIUS_HT_LOFIG
=GEN_HT_LOFIG
;
326 SwitchLOFIGContext(); // => genius
327 // for (lf=HEAD_LOFIG; lf!=NULL; lf=lf->NEXT) unlocklofig(lf) ;
329 SwitchLOFIGContext(); // => normal
331 GENIUS_HEAD_LOFIG
=NULL
; GENIUS_HT_LOFIG
=NULL
; NEW_LOINS_NAMES_HT
=addht(10);
332 LOINS_LIST_CONTROL
=addht(10);
333 GEN_HEAD_LOFIG
=NULL
; GEN_HT_LOFIG
=NULL
;
335 SwitchLOFIGContext(); // => genius
340 /* ----> GENIUS_PRIORITY */
342 GENIUS_PRIORITY
= APIReadLibrary(GENIUS_LIB_NAME
,GENIUS_LIB_PATH
, GEN_DEBUG_LEVEL
>0?GENIUS_OUTPUT
:NULL
);
345 avt_errmsg(GNS_ERRMSG
, "039", AVT_ERR
, err
);
346 //fprintf(stderr,"*** %d error(s) detected, I can't get farther!! ***\n",err);
349 if (!GENIUS_PRIORITY
) return NULL
;
351 Build_All_Transistor_Models();
353 LoadSpiceFCLFiles(GENIUS_PRIORITY
);
355 GNS_TEMPLATE_HT
=gns_create_template_hierarchy(GENIUS_PRIORITY
);
357 APIParseFile_SetTemplateInfo(GNS_TEMPLATE_HT
);
359 GENIUS_TREE
= Read_All(GENIUS_PRIORITY
); /* ----> GENIUS_TREE */
361 APIParseFile_SetTemplateInfo(NULL
);
363 if (!GENIUS_TREE
) return NULL
;
364 APIVerify_C_Functions(genius_ec
);
368 avt_errmsg(GNS_ERRMSG
, "039", AVT_ERR
, err
);
369 //fprintf(stderr,"*** %d error(s) detected, I can't get farther!! ***\n",err);
373 // call user init function
379 if (APIExecAPICallFunc(genius_ec
, &cf
, &ret
, 1)==0)
384 /*get a tree_list for GENIUS and FCL */
385 bi_list
=Verif_All(GENIUS_TREE
);
386 for (p
=bi_list
; p
; p
=p
->NEXT
) {
387 if (p
->TYPE
==FCL
) fcl
=(chain_list
*)p
->DATA
;
388 if (p
->TYPE
==GENIUS
) genius
=(chain_list
*)p
->DATA
;
393 avt_errmsg(GNS_ERRMSG
, "039", AVT_ERR
, err
);
394 //fprintf(stderr,"\n%d error(s) detected, I can't get farther!!\n",err);
400 if (GEN_DEBUG_LEVEL
>0) LoadDynamicLibraries(GENIUS_OUTPUT
);
401 else LoadDynamicLibraries(NULL
);
403 if (genius_ec
->ALL_USED_FUNCTIONS
!=NULL
&& APICheckCFunctions(genius_ec
)) EXIT(1);
410 for (p
=API_ACTION_RESTART
; p
!=NULL
; p
=p
->NEXT
)
412 func
=(libfunc_type
)p
->DATA
;
413 func(&ret
, NULL
, 0 , buf
);
414 mbkfree(ret
->TYPE
); mbkfree(ret
);
419 #ifdef AVERTEC_LICENSE
420 if(avt_givetoken("YAGLE_LICENSE_SERVER", "gns")!=AVT_VALID_TOKEN
) EXIT(1) ;
422 Build_All_Models(GENIUS_TREE
,fcl
);
427 SwitchLOFIGContext(); // => normal
430 LATEST_GNS_RUN
=(ALL_FOR_GNS
*)mbkalloc(sizeof(ALL_FOR_GNS
));
431 LATEST_GNS_RUN
->ALL_INSTANCES
=NULL
;
432 LATEST_GNS_RUN
->FIGNAME
=netlist
->NAME
;
433 LATEST_GNS_RUN
->GLOBAL_LOFIG
=netlist
;
434 LATEST_GNS_RUN
->TEMPLATE_HT
=GNS_TEMPLATE_HT
;
435 tmpfunc
=external_getlofig
;
436 external_getlofig
=genius_external_getlofig
;
439 ret
=FindInstances (netlist
,genius
,fcl
);
441 LATEST_GNS_RUN
->RETURN
=ret
;
443 external_getlofig
=tmpfunc
;
445 SwitchLOFIGContext(); // => genius
447 freechain(genius_ec
->BLOCKS
);
448 genius_ec
->BLOCKS
=NULL
;
449 Free_Tree(GENIUS_TREE
);
457 SwitchLOFIGContext(); // => normal
459 /*close file report .gen*/
460 if (GENIUS_OUTPUT
!=stdout
&& GENIUS_OUTPUT
!=stderr
) fclose(GENIUS_OUTPUT
);
462 /*file names are used for message and idetification in GENIUS*/
463 APIFreeLibrary(GENIUS_PRIORITY
);
464 GENIUS_PRIORITY
=NULL
; delht(NEW_LOINS_NAMES_HT
);
465 delht(LOINS_LIST_CONTROL
);
466 free_all_blocks_to_free();
468 APIFreeExecutionContext(genius_ec
);
473 t_arg param
, *tab
[1];
479 for (bbox
=netlist
->LOINS
; bbox
!=NULL
; bbox
=bbox
->NEXT
)
480 ret2
=addchain(ret2
, bbox
);
481 for (p
=ret
; p
!=NULL
; p
=p
->NEXT
)
482 ret2
=addchain(ret2
, p
->DATA
);
484 for (p
=API_ACTION_TOPLEVEL
; p
!=NULL
; p
=p
->NEXT
)
489 param
.VALUE
=mbkalloc(sizeof(long));
490 *(long *)param
.VALUE
=(long)ret2
;
492 func
=(libfunc_type
)p
->DATA
;
494 j
=func(&rett
, tab
, 1 , buf
);
497 avt_errmsg(GNS_ERRMSG
, "042", AVT_FATAL
, buf
);
498 //fprintf(stderr,"Error: %s\n",buf);
502 mbkfree(param
.VALUE
);
503 mbkfree(rett
->TYPE
); mbkfree(rett
);
508 if (outname
!=NULL
) LATEST_GNS_RUN
->FIGNAME
=namealloc(outname
);
510 gnsApplyConnectorOrientation(LATEST_GNS_RUN
);
512 if (!(GEN_OPTIONS_PACK
& GEN_NO_GNS
))
515 if (GEN_OPTIONS_PACK
& GEN_VERBOSE_GNS
) mode
='n';
516 gnsDriveCorrespondanceTables(LATEST_GNS_RUN
, mode
);
519 // destruction des heaps sauf pour les tables de correspondances
520 for (err
=0; err
<(signed)(sizeof(heapfreefuncs
)/sizeof(*heapfreefuncs
)); err
++)
523 memcpy(&LATEST_GNS_RUN
->external_ctx
, &newcontext
, sizeof(mbkContext
));
524 genius_external_setcontext(oldctx
);
528 if (GNS_RECURSION
==0)
531 HOOK_GETLOADEDLOFIG
=NULL
;
537 /* display system and user time */
540 genius_print_time(struct rusage
*start
, struct rusage
*end
, time_t rstart
, time_t rend
)
543 unsigned long user
, syst
;
544 unsigned long userM
, userS
, userD
;
545 unsigned long systM
, systS
, systD
;
548 temps
= rend
- rstart
;
549 user
= (100 * end
->ru_utime
.tv_sec
+ (end
->ru_utime
.tv_usec
/ 10000))
550 - (100 * start
->ru_utime
.tv_sec
+ (start
->ru_utime
.tv_usec
/ 10000));
551 syst
= (100 * end
->ru_stime
.tv_sec
+ (end
->ru_stime
.tv_usec
/ 10000))
552 - (100 * start
->ru_stime
.tv_sec
+ (start
->ru_stime
.tv_usec
/ 10000));
555 userS
= (user
% 6000) / 100;
556 userD
= (user
% 100) / 10;
559 systS
= (syst
% 6000) / 100;
560 systD
= (syst
% 100) / 10;
562 avt_fprintf(GENIUS_OUTPUT
, "¤+ %02ldm%02lds", (long) (temps
/ 60), (long) (temps
% 60));
563 avt_fprintf(GENIUS_OUTPUT
, "¤+ u:%02ldm%02ld.%ld", userM
, userS
, userD
);
564 bytes
= mbkprocessmemoryusage();
565 avt_fprintf(GENIUS_OUTPUT
, "¤+ M:%ldKb\n", bytes
/ 1024);
567 fflush(GENIUS_OUTPUT
);
569 char *genius_getutime(struct rusage
*start
, struct rusage
*end
)
572 unsigned long userM
, userS
, userD
;
573 static char temp
[64];
575 user
= (100 * end
->ru_utime
.tv_sec
+ (end
->ru_utime
.tv_usec
/ 10000))
576 - (100 * start
->ru_utime
.tv_sec
+ (start
->ru_utime
.tv_usec
/ 10000));
579 userS
= (user
% 6000) / 100;
580 userD
= (user
% 100) / 10;
582 sprintf(temp
, "%02ldm%02ld.%ld", userM
, userS
, userD
);
588 genius_chrono(struct rusage
*t
, time_t *rt
)
590 getrusage(RUSAGE_SELF
, t
);
594 tree_list
*Read_All(lib_entry
*files_list
)
598 tree_list
*res
=NULL
,*sav
=NULL
;
600 chain_list
*old
, *cl
;
604 avt_errmsg(GNS_ERRMSG
, "043", AVT_WARNING
);
605 //gen_printf(0, "warning: No model file in library\n");
608 /* read all files listed */
609 for (p
=files_list
;p
;p
=p
->NEXT
)
613 if (strcasecmp(p
->name
,"none")!=0)
619 gen_printf(0, "Opening model file %s....\n",p
->name
);
621 r
=strrchr(p
->name
, '.');
622 if (r
!=NULL
&& strcasecmp(r
, ".tcl")==0)
626 nb
=fread(r
,sizeof(char),1000000, f
);
628 if (Tcl_EvalEx((Tcl_Interp
*)TCL_INTERPRETER
, r
, -1, TCL_EVAL_GLOBAL
)==TCL_ERROR
)
629 avt_errmsg(GNS_ERRMSG
, "165", AVT_ERROR
, p
->name
, Tcl_GetErrorLine((Tcl_Interp
*)TCL_INTERPRETER
), Tcl_GetStringResult((Tcl_Interp
*)TCL_INTERPRETER
));
634 old
=genius_ec
->BLOCKS
;
635 res
=APIParseFile(f
, p
->name
, genius_ec
, p
->paramset
);
637 for (done
=0, cl
=genius_ec
->BLOCKS
; cl
!=old
; cl
=cl
->NEXT
)
639 if (APIBlockIsEntity((tree_list
*)cl
->DATA
))
643 p
->entity
=APIEntityName((tree_list
*)cl
->DATA
);
648 p0
=(lib_entry
*)mbkalloc(sizeof(lib_entry
));
649 memcpy(p0
, p
, sizeof(lib_entry
));
650 p0
->entity
=APIEntityName((tree_list
*)cl
->DATA
);
651 p0
->paramset
=dup_adt_list(p0
->paramset
);
661 if (sav
) sav
=PutBin_Tree(';',"",0,sav
,res
); /*PUT_BIN(';',sav,res);*/
669 avt_errmsg(GNS_ERRMSG
, "166", AVT_ERROR
, p
->name
);
676 // spice FCL, order is not modified
677 if (sav
) sav
=PutBin_Tree(';',"",0,sav
,p
->tree
);
681 } /* end of loop on files list */
685 ht
*gns_create_template_hierarchy(lib_entry
*files_list
)
693 for (p
=files_list
;p
;p
=p
->NEXT
)
697 if (gen_find_template_corresp(NULL
, p
->paramset
, p
->model
, res
)==0)
700 if (gen_get_template_corresp(t_h
, p
->model
)==NULL
)
702 gen_printf(1,"Adding template '%s' from model '%s'\n",res
,p
->model
);
703 gen_add_template_corresp(t_h
, res
, p
->model
, p
->paramset
);