1 /****************************************************************************/
3 /* Chaine de CAO & VLSI Alliance */
5 /* Produit : YAGLE v3.50 */
6 /* Fichier : yag_disa.c */
8 /* (c) copyright 1994 Laboratoire MASI equipe CAO & VLSI */
9 /* Tous droits reserves */
10 /* Support : e-mail alliance-support@asim.lip6.fr */
12 /* Auteur(s) : Anthony LESTER le : 12/04/1994 */
14 /* Modifie par : le : ../../.... */
15 /* Modifie par : le : ../../.... */
16 /* Modifie par : le : ../../.... */
18 /****************************************************************************/
20 #include "yag_headers.h"
22 yag_context_list
*YAG_CONTEXT
= NULL
;
24 /* initialise first context to default values */
29 YAG_CONTEXT
->YAG_FILE
= FALSE
;
30 YAG_CONTEXT
->YAG_CONE_NETLIST
= FALSE
;
31 YAG_CONTEXT
->YAG_BEFIG
= TRUE
;
32 YAG_CONTEXT
->YAG_BLACKBOX_SUPPRESS
= FALSE
;
33 YAG_CONTEXT
->YAG_BLACKBOX_IGNORE
= FALSE
;
34 YAG_CONTEXT
->YAG_NORC
= FALSE
;
35 YAG_CONTEXT
->YAG_HIERARCHICAL_MODE
= FALSE
;
36 YAG_CONTEXT
->YAG_CURLOFIG
= NULL
;
37 YAG_CONTEXT
->YAG_CURCNSFIG
= NULL
;
38 YAG_CONTEXT
->YAG_STAT_MODE
= FALSE
;
39 YAG_CONTEXT
->YAG_LOOP_MODE
= FALSE
;
40 YAG_CONTEXT
->YAG_SILENT_MODE
= FALSE
;
41 YAG_CONTEXT
->YAG_HELP_S
= FALSE
;
42 YAG_CONTEXT
->YAG_DEBUG_CONE
= NULL
;
43 YAG_CONTEXT
->YAGLE_TOOLNAME
= "yagle";
44 YAG_CONTEXT
->YAGLE_LANG
= 'E';
45 YAG_CONTEXT
->YAGLE_ERR_FILE
= NULL
;
46 YAG_CONTEXT
->YAGLE_STAT_FILE
= NULL
;
47 YAG_CONTEXT
->YAGLE_LOOP_FILE
= NULL
;
48 YAG_CONTEXT
->YAGLE_NB_ERR
= 0;
49 YAG_CONTEXT
->YAGLE_INSTANCE_BEFIGS
= NULL
;
50 YAG_CONTEXT
->YAG_MAX_LINKS
= 6;
51 YAG_CONTEXT
->YAG_RELAX_LINKS
= 6;
52 YAG_CONTEXT
->YAG_BDDCEILING
= 10000;
53 YAG_CONTEXT
->YAG_MAXNODES
= 0;
54 YAG_CONTEXT
->YAG_LASTNODECOUNT
= 0;
55 YAG_CONTEXT
->YAG_FILENAME
= NULL
;
56 YAG_CONTEXT
->YAG_FIGNAME
= NULL
;
57 YAG_CONTEXT
->YAG_OUTNAME
= NULL
;
58 YAG_CONTEXT
->YAG_REQUIRE_COMPLETE_GRAPH
= TRUE
;
59 YAG_CONTEXT
->YAG_USE_FCF
= 1;
60 YAG_CONTEXT
->YAG_ONE_SUPPLY
= 0;
61 YAG_CONTEXT
->YAG_NO_SUPPLY
= 0;
62 YAG_CONTEXT
->YAG_ORIENT
= 0;
63 YAG_CONTEXT
->YAG_PROP_HZ
= 0;
64 YAG_CONTEXT
->YAG_MAKE_CELLS
= 1;
65 YAG_CONTEXT
->YAG_GENIUS
= 0;
66 YAG_CONTEXT
->YAG_ONLY_GENIUS
= 0;
67 YAG_CONTEXT
->YAG_CELL_SHARE
= 0;
68 YAG_CONTEXT
->YAG_DETECT_LATCHES
= 1;
69 YAG_CONTEXT
->YAG_DETECT_PRECHARGE
= 0;
70 YAG_CONTEXT
->YAG_BLEEDER_STRICTNESS
= 1;
71 YAG_CONTEXT
->YAG_LOOP_ANALYSIS
= 1;
72 YAG_CONTEXT
->YAG_AUTO_RS
= 1;
73 YAG_CONTEXT
->YAG_BUS_ANALYSIS
= 0;
74 YAG_CONTEXT
->YAG_FCL_DETECT
= 0;
75 YAG_CONTEXT
->YAG_ONLY_FCL
= 0;
76 YAG_CONTEXT
->YAG_DEPTH
= 9;
77 YAG_CONTEXT
->YAG_NOTSTRICT
= 0;
78 YAG_CONTEXT
->YAG_REMOVE_PARA
= 1;
79 YAG_CONTEXT
->YAG_MINIMISE_CONES
= 0;
80 YAG_CONTEXT
->YAG_RELAX_ALGO
= 0;
81 YAG_CONTEXT
->YAG_MINIMISE_INV
= 0;
82 YAG_CONTEXT
->YAG_GEN_SIGNATURE
= 1;
83 YAG_CONTEXT
->YAG_ASSUME_PRECEDE
= 0;
84 YAG_CONTEXT
->YAG_BLEEDER_PRECHARGE
= 0;
85 YAG_CONTEXT
->YAG_TRISTATE_MEMORY
= 0;
86 YAG_CONTEXT
->YAG_MARK_TRISTATE_MEMORY
= 0;
87 YAG_CONTEXT
->YAG_INTERFACE_VECTORS
= 0;
88 YAG_CONTEXT
->YAG_SIMPLIFY_EXPR
= 0;
89 YAG_CONTEXT
->YAG_SIMPLIFY_PROCESSES
= 0;
90 YAG_CONTEXT
->YAG_COMPACT_BEHAVIOUR
= 0;
91 YAG_CONTEXT
->YAG_ELP
= 0;
92 YAG_CONTEXT
->YAG_BLOCK_BIDIR
= 0;
93 YAG_CONTEXT
->YAG_STRICT_CKLATCH
= 0;
94 YAG_CONTEXT
->YAG_THRESHOLD
= 3.0;
95 YAG_CONTEXT
->YAG_TAS_TIMING
= YAG_NO_TIMING
;
96 YAG_CONTEXT
->YAG_SPLITTIMING_RATIO
= 3.0;
97 YAG_CONTEXT
->YAG_SENSITIVE_RATIO
= 0.0;
98 YAG_CONTEXT
->YAG_SENSITIVE_MAX
= 0;
99 YAG_CONTEXT
->YAG_CONSTRAINT_LIST
= NULL
;
100 YAG_CONTEXT
->YAG_BIABL_INDEX
= 0;
101 YAG_CONTEXT
->YAG_CURCIRCUIT
= NULL
;
102 YAG_CONTEXT
->YAG_CONE_GRAPH
= NULL
;
103 YAG_CONTEXT
->YAG_SUPPORT_GRAPH
= NULL
;
104 YAG_CONTEXT
->YAG_ITERATIONS
= 0;
105 YAG_CONTEXT
->YAG_KEEP_REDUNDANT
= 0;
106 YAG_CONTEXT
->YAG_KEEP_GLITCHERS
= 0;
107 YAG_CONTEXT
->YAG_AUTOLOOP_CEILING
= 15;
108 YAG_CONTEXT
->YAG_AUTOLOOP_DEPTH
= 9;
109 YAG_CONTEXT
->YAG_BUS_DEPTH
= 9;
110 YAG_CONTEXT
->YAG_USESTMSOLVER
= 0;
111 YAG_CONTEXT
->YAG_UNMARK_BISTABLES
= 0;
112 YAG_CONTEXT
->YAG_LATCH_REQUIRE_CLOCK
= 0;
113 YAG_CONTEXT
->YAG_AUTO_FLIPFLOP
= 1;
114 YAG_CONTEXT
->YAG_AUTO_ASYNC
= 0;
115 YAG_CONTEXT
->YAG_AUTO_MEMSYM
= 0;
116 YAG_CONTEXT
->YAG_DETECT_REDUNDANT
= 1;
117 YAG_CONTEXT
->YAG_DETECT_LEVELHOLD
= 0;
118 YAG_CONTEXT
->YAG_SIMPLE_LATCH
= 0;
119 YAG_CONTEXT
->YAG_USE_CONNECTOR_DIRECTION
= 0;
120 YAG_CONTEXT
->YAG_CLOCK_GATE
= 0;
121 YAG_CONTEXT
->YAG_BEFIG_LIST
= NULL
;
122 YAG_CONTEXT
->YAG_DETECT_SIMPLE_MEMSYM
= 0;
123 YAG_CONTEXT
->YAG_MEMSYM_HEURISTIC
= 0;
124 YAG_CONTEXT
->YAG_STUCK_LATCH
= 1;
127 /****************************************************************************
128 * function yagDisassemble(); *
129 ****************************************************************************/
131 /**** disassembly of a transistor netlist ****/
133 cnsfig_list
*yagDisassemble(char *figname
, lofig_list
*ptmbkfig
, long mode
)
135 cnsfig_list
*ptcnsfig
= NULL
;
136 lofig_list
*ptrootlofig
= NULL
;
137 lofig_list
*ptcorelofig
= NULL
;
138 locon_list
*ptcon
= NULL
;
139 locon_list
*ptheadintcon
= NULL
;
140 locon_list
*ptintcon
= NULL
;
141 losig_list
*ptsig
= NULL
;
142 loins_list
*ptins
= NULL
;
143 cone_list
*ptcone
= NULL
;
144 cone_list
*ptsymcone
= NULL
;
145 cone_list
*ptloopcone
= NULL
;
146 cone_list
*ptnextcone
;
148 cell_list
*ptnextcell
;
150 lotrs_list
*pttrans
= NULL
, *ptothertrans
= NULL
;
152 chain_list
*recognised
;
166 long fcltype
, otherfcltype
;
171 int num_undrivengate
= 0;
172 int num_bleeder
= 0, num_levelhold
= 0, num_latch
= 0, num_rs
= 0, num_flipflop
= 0, num_dlatch
= 0, num_bad
= 0;
174 int num_noinputs
= 0;
179 int num_precharge
= 0;
180 int numconunused
= 0;
181 long num_cmosdual
= 0;
185 int close_err_file
= FALSE
;
188 chain_list
*list0
, *list1
;
192 mbk_comcheck( mbk_signlofig(ptmbkfig
), 0, 0 );
195 if (yagCountChains((chain_list
*)ptmbkfig
->LOTRS
) > 3000) {
197 printf("****************************************************\n");
198 printf("* Evaluation Version limited to 3000 Transistors *\n");
199 printf("****************************************************\n");
204 loglvl1
= avt_islog(1,LOGYAG
);
205 if (YAG_CONTEXT
== NULL
) yagBug(DBG_NO_CONTEXT
,"yagDisassemble",NULL
,NULL
,0);
206 if (YAG_CONTEXT
->YAG_FIGNAME
== NULL
) YAG_CONTEXT
->YAG_FIGNAME
= ptmbkfig
->NAME
;
207 if (figname
!= NULL
) YAG_CONTEXT
->YAG_OUTNAME
= figname
;
208 if (YAG_CONTEXT
->YAG_OUTNAME
== NULL
) YAG_CONTEXT
->YAG_OUTNAME
= YAG_CONTEXT
->YAG_FIGNAME
;
209 if ((mode
& YAG_GENBEFIG
) != 0) YAG_CONTEXT
->YAG_BEFIG
= TRUE
;
210 else YAG_CONTEXT
->YAG_BEFIG
= FALSE
;
211 #ifdef AVERTEC_LICENSE
212 if (YAG_CONTEXT
->YAG_BEFIG
) {
213 if(avt_givetoken("YAGLE_LICENSE_SERVER", "yagle")!=AVT_VALID_TOKEN
) EXIT(1);
217 ifl
=getloadedinffig(YAG_CONTEXT
->YAG_FIGNAME
);
219 if (ptmbkfig
->LOTRS
== NULL
&& ptmbkfig
->LOINS
== NULL
) {
220 avt_errmsg(YAG_ERRMSG
, "010", AVT_WARNING
, ptmbkfig
->NAME
);
221 YAG_CONTEXT
->YAG_CURCNSFIG
= addcnsfig(CNS_HEADCNSFIG
, YAG_CONTEXT
->YAG_OUTNAME
, ptmbkfig
->LOCON
, NULL
, ptmbkfig
->LOTRS
, ptmbkfig
->LOINS
, NULL
, NULL
, NULL
, NULL
);
222 return YAG_CONTEXT
->YAG_CURCNSFIG
;
224 YAG_CONTEXT
->YAG_CURLOFIG
= ptmbkfig
;
226 #ifdef AVERTEC_LICENSE
227 if(avt_givetoken("YAGLE_LICENSE_SERVER", YAG_CONTEXT
->YAGLE_TOOLNAME
)!=AVT_VALID_TOKEN
) EXIT(1);
231 /*------------------------*
233 *-------------------------*/
235 if (YAG_CONTEXT
->YAG_STAT_MODE
) {
236 YAG_CONTEXT
->YAGLE_STAT_FILE
=mbkfopen(YAG_CONTEXT
->YAG_OUTNAME
,"stat",WRITE_TEXT
);
237 if(YAG_CONTEXT
->YAGLE_STAT_FILE
== NULL
) {
238 char buff
[YAGBUFSIZE
];
239 sprintf(buff
,"%s.stat",YAG_CONTEXT
->YAG_OUTNAME
);
240 avt_errmsg(YAG_ERRMSG
, "006", AVT_FATAL
, buff
);
242 sprintf(buffer
,"Statistic file : %s.stat\n",YAG_CONTEXT
->YAG_OUTNAME
);
243 avt_printExecInfo( YAG_CONTEXT
->YAGLE_STAT_FILE
, "#", buffer
, "");
246 /*------------------------*
248 *-------------------------*/
250 if (YAG_CONTEXT
->YAGLE_ERR_FILE
== NULL
) {
251 YAG_CONTEXT
->YAGLE_ERR_FILE
=mbkfopen(YAG_CONTEXT
->YAG_OUTNAME
,"rep",WRITE_TEXT
);
252 if(YAG_CONTEXT
->YAGLE_ERR_FILE
== NULL
) {
253 char buff
[YAGBUFSIZE
];
254 sprintf(buff
,"%s.rep",YAG_CONTEXT
->YAG_OUTNAME
);
255 avt_errmsg(YAG_ERRMSG
, "006", AVT_FATAL
, buff
);
258 sprintf(buffer
,"Report file : %s.rep\n",YAG_CONTEXT
->YAG_OUTNAME
);
259 avt_printExecInfo( YAG_CONTEXT
->YAGLE_ERR_FILE
, "#", buffer
, "");
261 close_err_file
= TRUE
;
264 /*---------------------------------------------------------------------------*
265 | Report lofig statistics |
266 *----------------------------------------------------------------------------*/
268 if( YAG_CONTEXT
->YAG_STAT_MODE
== TRUE
) {
269 yagStatLofig(ptmbkfig
) ;
272 /*---------------------------------------------------------------------------*
273 | Configuration check level II |
274 *----------------------------------------------------------------------------*/
277 chain_list
*data
, *lst
;
281 for (ptsig
= ptmbkfig
->LOSIG
; ptsig
; ptsig
= ptsig
->NEXT
)
283 lst
=dupchainlst(ptsig
->NAMECHAIN
);
284 data
= append(lst
, data
);
287 inf_CheckRegistry(stdout
,ifl
,2,data
);
294 /*---------------------------------------------------------------------------*
295 | Mark power supply signals |
296 *----------------------------------------------------------------------------*/
298 yagFindSupplies(ifl
, ptmbkfig
, FALSE
);
299 yagFindInternalSupplies(ifl
, ptmbkfig
, FALSE
);
300 if(sim_SetPowerSupply (ptmbkfig
)) stm_init();
301 mbk_CheckPowerSupplies(ptmbkfig
);
303 /*--------------------------------------------------------------------------*
304 | Clean up the signal & connector names |
305 +---------------------------------------------------------------------------*/
307 yagAddVal_s(ifl
, ptmbkfig
);
309 for (ptsig
= ptmbkfig
->LOSIG
; ptsig
; ptsig
= ptsig
->NEXT
) {
310 chain_list
*savenames
;
312 ptsig
->USER
= addptype(ptsig
->USER
, YAG_CHECK_PTYPE
, NULL
);
314 name
= yagGetName(ifl
, ptsig
);
315 savenames
= ptsig
->NAMECHAIN
;
316 ptsig
->NAMECHAIN
= addchain(NULL
, name
);
317 for (ptchain
= savenames
; ptchain
; ptchain
= ptchain
->NEXT
) {
318 if (ptchain
->DATA
!= name
) ptsig
->NAMECHAIN
= addchain(ptsig
->NAMECHAIN
, ptchain
->DATA
);
320 ptsig
->NAMECHAIN
= reverse(ptsig
->NAMECHAIN
);
321 freechain(savenames
);
325 for (pttrans
= ptmbkfig
->LOTRS
; pttrans
; pttrans
= pttrans
->NEXT
) {
326 if (getptype(pttrans
->SOURCE
->SIG
->USER
, YAG_CHECK_PTYPE
) == NULL
) {
327 fprintf(stderr
, "Incoherent netlist at signal '%s'\n", (char *)pttrans
->SOURCE
->SIG
->NAMECHAIN
->DATA
);
330 if (getptype(pttrans
->DRAIN
->SIG
->USER
, YAG_CHECK_PTYPE
) == NULL
) {
331 fprintf(stderr
, "Incoherent netlist at signal '%s'\n", (char *)pttrans
->DRAIN
->SIG
->NAMECHAIN
->DATA
);
334 if (getptype(pttrans
->GRID
->SIG
->USER
, YAG_CHECK_PTYPE
) == NULL
) {
335 fprintf(stderr
, "Incoherent netlist at signal '%s'\n", (char *)pttrans
->GRID
->SIG
->NAMECHAIN
->DATA
);
341 /*----------------------------------------------------------------------*
342 | Chain connector list to each signal |
343 *-----------------------------------------------------------------------*/
346 lofigchain(ptmbkfig
);
351 /*---------------------------------------------------------------------------*
352 | Mark the transparences |
353 *----------------------------------------------------------------------------*/
355 yagTestTransparence(ptmbkfig
);
357 /*---------------------------------------------------------------------------*
358 | Mark Blackbox transistors as unused |
359 *----------------------------------------------------------------------------*/
361 yagMarkUnusedTrans(ptmbkfig
);
363 /*---------------------------------------------------------------------------*
364 | Test des transistors |
365 *----------------------------------------------------------------------------*/
367 yagChrono(&START
,&start
);
368 if (!YAG_CONTEXT
->YAG_SILENT_MODE
) yagMessage(MES_TRANS_CHECKING
,NULL
);
369 yagTestTransistors(ptmbkfig
, FALSE
);
370 yagChrono(&END
,&end
);
371 if (!YAG_CONTEXT
->YAG_SILENT_MODE
) yagPrintTime(&START
,&END
,start
,end
);
373 /*---------------------------------------------------------------------------*
374 | Transfer INF_MARKSIG & INF_MARKTRANS |
375 *----------------------------------------------------------------------------*/
377 list0
=inf_GetEntriesByType(ifl
, INF_MARKTRANS
, INF_ANY_VALUES
);
379 yagInfMarkTrans(ifl
, ptmbkfig
, list0
);
382 list0
=inf_GetEntriesByType(ifl
, INF_MARKSIG
, INF_ANY_VALUES
);
384 yagInfMarkSig(ifl
, ptmbkfig
, list0
);
388 /*---------------------------------------------------------------------------*
389 | Hierarchical pattern recognition |
390 *----------------------------------------------------------------------------*/
392 if (YAG_CONTEXT
->YAG_GENIUS
|| YAG_CONTEXT
->YAG_ONLY_GENIUS
) {
393 yagChrono(&START
,&start
);
394 if (!YAG_CONTEXT
->YAG_SILENT_MODE
) yagMessage(MES_GENIUS
,NULL
);
395 recognised
= genius_main(ptmbkfig
, NULL
, NULL
, YAG_CONTEXT
->YAG_OUTNAME
);
397 if (recognised
!= NULL
) {
399 if (YAG_CONTEXT
->YAG_ONLY_GENIUS
) ptmbkfig
= yagCutLofig(ifl
, ptmbkfig
, recognised
, &ptrootlofig
, FALSE
);
400 else fclMarkInstances(ptmbkfig
, recognised
, FALSE
, FALSE
);
401 YAG_CONTEXT
->YAG_CURLOFIG
= ptmbkfig
;
402 for (ptchain
= recognised
; ptchain
; ptchain
= ptchain
->NEXT
) {
403 ptins
= (loins_list
*)ptchain
->DATA
;
404 fclCleanTransList(ptins
);
405 if ((ptbefig
= beg_get_befigByName(ptins
->INSNAME
)) != NULL
) {
406 YAG_CONTEXT
->YAGLE_INSTANCE_BEFIGS
= addchain(YAG_CONTEXT
->YAGLE_INSTANCE_BEFIGS
, ptbefig
);
411 /* recreate LOFIGCHAIN */
412 lofigchain(ptmbkfig
);
414 yagChrono(&END
,&end
);
415 if (!YAG_CONTEXT
->YAG_SILENT_MODE
) yagPrintTime(&START
,&END
,start
,end
);
418 if (YAG_CONTEXT
->YAG_ONLY_GENIUS
) {
420 lofig_list
*ptrealrootfig
;
421 char buf
[YAGBUFSIZE
];
423 sprintf(buf
, "%s_yagroot", YAG_CONTEXT
->YAG_FIGNAME
);
424 ptrealrootfig
= yagBuildGeniusBehHierarchy(ptrootlofig
, ptmbkfig
, recognised
, namealloc(buf
));
425 savelofig(ptrealrootfig
);
427 /* delete GENIUS instances */
428 for (ptchain
= recognised
; ptchain
; ptchain
= ptchain
->NEXT
) {
429 fclDeleteInstance((loins_list
*)ptchain
->DATA
);
431 freechain(recognised
);
433 /* remove power supply markings and save core figure */
434 for (ptcon
= ptmbkfig
->LOCON
; ptcon
; ptcon
= ptcon
->NEXT
) {
436 if (ptsig
->TYPE
!= 'E') {
438 ptcon
->DIRECTION
= 'I';
441 for (ptsig
= ptmbkfig
->LOSIG
; ptsig
; ptsig
= ptsig
->NEXT
) {
442 if (ptsig
->TYPE
!= 'E' && ptsig
->TYPE
!= 'I') {
448 if (YAG_CONTEXT
->YAG_STAT_MODE
) fclose(YAG_CONTEXT
->YAGLE_STAT_FILE
);
449 fclose(YAG_CONTEXT
->YAGLE_ERR_FILE
);
453 /*---------------------------------------------------------------------------*
454 | Memory allocation and data structure initialisation |
455 *----------------------------------------------------------------------------*/
457 ptcnsfig
= addcnsfig(CNS_HEADCNSFIG
, YAG_CONTEXT
->YAG_OUTNAME
, ptmbkfig
->LOCON
, NULL
, ptmbkfig
->LOTRS
, ptmbkfig
->LOINS
, NULL
, NULL
, ptmbkfig
, NULL
);
458 YAG_CONTEXT
->YAG_CURCNSFIG
= ptcnsfig
;
460 /*---------------------------------------------------------------------------*
461 | Match cells from transistor net-list library |
462 *----------------------------------------------------------------------------*/
464 if (YAG_CONTEXT
->YAG_FCL_DETECT
) {
465 yagChrono(&START
,&start
);
466 if (!YAG_CONTEXT
->YAG_SILENT_MODE
) yagMessage(MES_MAKING_CELLS
,NULL
);
467 ptcnsfig
->CELL
= fclFindCells(ptmbkfig
);
468 YAG_CONTEXT
->YAGLE_INSTANCE_BEFIGS
= append(YAG_CONTEXT
->YAGLE_INSTANCE_BEFIGS
, FCL_INSTANCE_BEFIGS
);
469 yagChrono(&END
,&end
);
470 if (!YAG_CONTEXT
->YAG_SILENT_MODE
) yagPrintTime(&START
,&END
,start
,end
);
472 if (YAG_CONTEXT
->YAG_ONLY_FCL
) {
473 if (YAG_CONTEXT
->YAG_STAT_MODE
) fclose(YAG_CONTEXT
->YAGLE_STAT_FILE
);
474 fclose(YAG_CONTEXT
->YAGLE_ERR_FILE
);
478 /*---------------------------------------------------------------------------*
479 | Check switches after FCL |
480 *----------------------------------------------------------------------------*/
481 for (pttrans
= ptmbkfig
->LOTRS
; pttrans
; pttrans
= pttrans
->NEXT
) {
482 fcltype
= 0; otherfcltype
= 0;
483 if ((ptuser
= getptype(pttrans
->USER
, CNS_SWITCH
)) != NULL
) {
484 ptothertrans
= (lotrs_list
*)ptuser
->DATA
;
485 if ((ptuser
= getptype(pttrans
->USER
, FCL_TRANSFER_PTYPE
)) != NULL
) {
486 fcltype
= (long)ptuser
->DATA
;
488 if ((ptuser
= getptype(ptothertrans
->USER
, FCL_TRANSFER_PTYPE
)) != NULL
) {
489 otherfcltype
= (long)ptuser
->DATA
;
491 if (fcltype
!= otherfcltype
) {
492 pttrans
->USER
= delptype(pttrans
->USER
, CNS_SWITCH
);
493 ptothertrans
->USER
= delptype(ptothertrans
->USER
, CNS_SWITCH
);
498 /*---------------------------------------------------------------------------*
499 | Restore parallel transistors |
500 *----------------------------------------------------------------------------*/
501 yagTransferParallel(ptmbkfig
);
502 mbk_restoreparallel(ptmbkfig
);
503 mbk_markparallel(ptmbkfig
);
504 ptcnsfig
->LOTRS
= ptmbkfig
->LOTRS
;
506 ifl
=getloadedinffig(YAG_CONTEXT
->YAG_FIGNAME
);
508 /*---------------------------------------------------------------------------*
509 | Create internal instance connectors |
510 *----------------------------------------------------------------------------*/
512 if ((ptuser
= getptype(ptmbkfig
->USER
, FCL_LOCON_PTYPE
)) != NULL
) {
513 ptcnsfig
->INTCON
= ptuser
->DATA
;
516 for (ptins
= ptmbkfig
->LOINS
; ptins
; ptins
= ptins
->NEXT
) {
517 /* check for NEVER directive on instance */
518 if ((ptuser
= getptype(ptins
->USER
, FCL_TRANSFER_PTYPE
)) != NULL
) {
519 if (((long)ptuser
->DATA
& FCL_NEVER
) != 0) continue;
521 if ((ptbefig
= beg_get_befigByName(ptins
->INSNAME
)) != NULL
) {
522 YAG_CONTEXT
->YAGLE_INSTANCE_BEFIGS
= addchain(YAG_CONTEXT
->YAGLE_INSTANCE_BEFIGS
, ptbefig
);
524 for (ptcon
= ptins
->LOCON
; ptcon
; ptcon
= ptcon
->NEXT
) {
526 if (ptsig
->TYPE
== CNS_SIGINT
) {
527 ptsig
->TYPE
= CNS_SIGEXT
;
528 ptintcon
= (locon_list
*)mbkalloc(sizeof(locon_list
));
529 ptintcon
->NAME
= (char *)ptsig
->NAMECHAIN
->DATA
;
530 ptintcon
->SIG
= ptsig
;
531 ptintcon
->ROOT
= NULL
;
532 ptintcon
->DIRECTION
= 'X';
533 ptintcon
->TYPE
= EXTERNAL
;
534 ptintcon
->USER
= NULL
;
535 ptintcon
->NEXT
= ptheadintcon
;
536 ptintcon
->PNODE
= NULL
;
537 ptheadintcon
= ptintcon
;
541 for (ptcon
= ptheadintcon
; ptcon
; ptcon
= ptcon
->NEXT
) {
542 ptcon
->SIG
->TYPE
= 'I';
544 if (ptheadintcon
!= NULL
) {
545 ptcnsfig
->INTCON
= (locon_list
*)append((chain_list
*)ptcnsfig
->INTCON
, (chain_list
*)ptheadintcon
);
548 /*---------------------------------------------------------------------------*
549 | Additional CNS initialisation |
550 *----------------------------------------------------------------------------*/
552 ptcnsfig
->LOCON
= ptmbkfig
->LOCON
;
553 ptcnsfig
->LOTRS
= ptmbkfig
->LOTRS
;
554 ptcnsfig
->LOINS
= ptmbkfig
->LOINS
;
556 for (ptcon
=ptcnsfig
->LOCON
;ptcon
!= NULL
;ptcon
=ptcon
->NEXT
) {
557 // delloconuser( ptcon );
558 ptcon
->ROOT
= (void *)ptcnsfig
;
559 // ptcon->USER = NULL;
561 if (ptcnsfig
->INTCON
!= NULL
) {
562 locon_list
*ptprevcon
= NULL
;
563 locon_list
*ptnextcon
= NULL
;
565 for (ptcon
= ptcnsfig
->INTCON
; ptcon
; ptcon
= ptnextcon
) {
566 ptnextcon
= ptcon
->NEXT
;
567 ptcon
->ROOT
= (void *)ptcnsfig
;
568 if (ptcon
->SIG
->TYPE
== 'I') {
569 ptcon
->SIG
->TYPE
= 'E';
570 ptuser
= getptype(ptcon
->SIG
->USER
, LOFIGCHAIN
);
571 if (ptuser
!= NULL
) {
572 ptuser
->DATA
= addchain(ptuser
->DATA
, ptcon
);
577 if (ptprevcon
== NULL
) ptcnsfig
->INTCON
= ptnextcon
;
578 else ptprevcon
->NEXT
= ptnextcon
;
585 /*---------------------------------------------------------------------------*
586 | Mark INF_INPUT connectors |
587 *----------------------------------------------------------------------------*/
589 list0
=inf_GetEntriesByType(ifl
, INF_INPUTS
, INF_ANY_VALUES
);
591 for (ptcon
= ptcnsfig
->LOCON
; ptcon
!= NULL
; ptcon
= ptcon
->NEXT
) {
592 for (ptchain
= list0
; ptchain
; ptchain
= ptchain
->NEXT
) {
593 if (mbk_TestREGEX(ptcon
->NAME
, (char *)ptchain
->DATA
) || mbk_LosigTestREGEX(ptcon
->SIG
, (char *)ptchain
->DATA
)) {
594 ptcon
->USER
= addptype(ptcon
->USER
, YAG_INPUT_PTYPE
, NULL
);
598 YAG_CONTEXT
->YAG_FLAGS
|=YAG_HAS_INF_INPUTS
;
602 /*---------------------------------------------------------------------------*
603 | Report oriented signals |
604 *----------------------------------------------------------------------------*/
606 for (ptsig
= ptmbkfig
->LOSIG
; ptsig
; ptsig
= ptsig
->NEXT
) {
607 if ((value
= yagGetVal_s(ptsig
)) >= 0) {
608 yagWarning(WAR_VALUE_S
, NULL
, (char *)ptsig
->NAMECHAIN
->DATA
, NULL
, (int)value
);
612 /*---------------------------------------------------------------------------*
613 | Initialisation of Bdd toolbox |
614 *----------------------------------------------------------------------------*/
618 /*---------------------------------------------------------------------------*
619 | Fabrication of CMOS dual cones |
620 *----------------------------------------------------------------------------*/
622 yagChrono(&START
,&start
);
623 if (!YAG_CONTEXT
->YAG_SILENT_MODE
) yagMessage(MES_DUAL_EXTRACT
,NULL
);
624 ptcnsfig
->CONE
= yagMakeConeList(ifl
, ptmbkfig
, ptcnsfig
);
625 yagChrono(&END
,&end
);
626 if (!YAG_CONTEXT
->YAG_SILENT_MODE
) yagPrintTime(&START
,&END
,start
,end
);
628 if ( loglvl1
) yagCountDualTrans(ptcnsfig
);
630 /*---------------------------------------------------------------------------*
631 | Configuration check level III |
632 *----------------------------------------------------------------------------*/
640 for (ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
)
642 pt
=getptype(ptcone
->USER
, CNS_SIGNAL
);
644 data
=append(dupchainlst(((losig_list
*)pt
->DATA
)->NAMECHAIN
), data
);
646 data
= addchain(data
,ptcone
->NAME
);
649 inf_CheckRegistry(stdout
,ifl
,3,data
);
655 /*---------------------------------------------------------------------------*
656 | Mark INF_STOP cones |
657 *----------------------------------------------------------------------------*/
659 list0
=inf_GetEntriesByType(ifl
, INF_STOP
, INF_ANY_VALUES
);
661 for (ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
662 ptsig
= (losig_list
*)getptype(ptcone
->USER
, CNS_SIGNAL
)->DATA
;
663 for (ptchain
= list0
; ptchain
; ptchain
= ptchain
->NEXT
) {
664 if (mbk_LosigTestREGEX(ptsig
, (char *)ptchain
->DATA
)) {
665 ptcone
->TYPE
|= YAG_STOP
;
672 /*---------------------------------------------------------------------------*
673 | Mark INF_SENSITIVE cones |
674 *----------------------------------------------------------------------------*/
676 list0
=inf_GetEntriesByType(ifl
, INF_SENSITIVE
, INF_ANY_VALUES
);
678 for (ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
679 ptsig
= (losig_list
*)getptype(ptcone
->USER
, CNS_SIGNAL
)->DATA
;
680 for (ptchain
= list0
; ptchain
; ptchain
= ptchain
->NEXT
) {
681 if (mbk_LosigTestREGEX(ptsig
, (char *)ptchain
->DATA
)) {
682 ptcone
->TECTYPE
|= YAG_SENSITIVE
;
689 /*---------------------------------------------------------------------------*
690 | Mark INF_DLATCH cones |
691 *----------------------------------------------------------------------------*/
693 list0
=inf_GetEntriesByType(ifl
, INF_DLATCH
, INF_YES
);
694 list1
=inf_GetEntriesByType(ifl
, INF_DLATCH
, INF_NO
);
695 if (list0
!= NULL
|| list1
!= NULL
) {
696 for (ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
697 ptsig
= (losig_list
*)getptype(ptcone
->USER
, CNS_SIGNAL
)->DATA
;
698 for (ptchain
= list0
; ptchain
; ptchain
= ptchain
->NEXT
) {
699 if (mbk_LosigTestREGEX(ptsig
, (char *)ptchain
->DATA
)) {
700 if ((ptuser
= getptype(ptcone
->USER
, YAG_INFO_PTYPE
)) != NULL
) {
701 ptuser
->DATA
= (void *)((long)ptuser
->DATA
| YAG_INFODLATCH
);
703 else ptcone
->USER
= addptype(ptcone
->USER
, YAG_INFO_PTYPE
, (void *)YAG_INFODLATCH
);
706 for (ptchain
= list1
; ptchain
; ptchain
= ptchain
->NEXT
) {
707 if (mbk_LosigTestREGEX(ptsig
, (char *)ptchain
->DATA
)) {
708 if ((ptuser
= getptype(ptcone
->USER
, YAG_INFO_PTYPE
)) != NULL
) {
709 ptuser
->DATA
= (void *)((long)ptuser
->DATA
| YAG_INFONOTDLATCH
);
711 else ptcone
->USER
= addptype(ptcone
->USER
, YAG_INFO_PTYPE
, (void *)YAG_INFONOTDLATCH
);
719 /*---------------------------------------------------------------------------*
720 | Mark INF_PRECHARGE cones |
721 *----------------------------------------------------------------------------*/
723 list0
=inf_GetEntriesByType(ifl
, INF_PRECHARGE
, INF_YES
);
724 list1
=inf_GetEntriesByType(ifl
, INF_PRECHARGE
, INF_NO
);
725 if (list0
!= NULL
|| list1
!= NULL
) {
726 for (ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
727 ptsig
= (losig_list
*)getptype(ptcone
->USER
, CNS_SIGNAL
)->DATA
;
728 for (ptchain
= list0
; ptchain
; ptchain
= ptchain
->NEXT
) {
729 if (mbk_LosigTestREGEX(ptsig
, (char *)ptchain
->DATA
)) {
730 ptcone
->TYPE
|= CNS_PRECHARGE
;
731 if ((ptuser
= getptype(ptcone
->USER
, YAG_INFO_PTYPE
)) != NULL
) {
732 ptuser
->DATA
= (void *)((long)ptuser
->DATA
| YAG_INFOPRECHARGE
);
734 else ptcone
->USER
= addptype(ptcone
->USER
, YAG_INFO_PTYPE
, (void *)YAG_INFOPRECHARGE
);
737 for (ptchain
= list1
; ptchain
; ptchain
= ptchain
->NEXT
) {
738 if (mbk_LosigTestREGEX(ptsig
, (char *)ptchain
->DATA
)) {
739 if ((ptuser
= getptype(ptcone
->USER
, YAG_INFO_PTYPE
)) != NULL
) {
740 ptuser
->DATA
= (void *)((long)ptuser
->DATA
| YAG_INFONOTPRECHARGE
);
742 else ptcone
->USER
= addptype(ptcone
->USER
, YAG_INFO_PTYPE
, (void *)YAG_INFONOTPRECHARGE
);
750 /*---------------------------------------------------------------------------*
751 | Mark INF_MARKRS cones |
752 *----------------------------------------------------------------------------*/
754 list0
=inf_GetEntriesByType(ifl
, INF_MARKRS
, INF_ANY_VALUES
);
756 for (ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
757 ptsig
= (losig_list
*)getptype(ptcone
->USER
, CNS_SIGNAL
)->DATA
;
758 for (ptchain
= list0
; ptchain
; ptchain
= ptchain
->NEXT
) {
759 if ((name
= mbk_LosigTestREGEX(ptsig
, (char *)ptchain
->DATA
)) != NULL
) {
760 inf_GetInt (ifl
, name
, INF_MARKRS
, &infval
);
762 case INF_RS_ILLEGAL
: type
= YAG_INFORSILLEGAL
; break;
763 case INF_RS_LEGAL
: type
= YAG_INFORSLEGAL
; break;
764 case INF_RS_MARKONLY
: type
= YAG_INFORSMARK
; break;
768 if ((ptuser
= getptype(ptcone
->USER
, YAG_INFO_PTYPE
)) != NULL
) {
769 ptuser
->DATA
= (void *)((long)ptuser
->DATA
| type
);
771 else ptcone
->USER
= addptype(ptcone
->USER
, YAG_INFO_PTYPE
, (void *)type
);
779 /*---------------------------------------------------------------------------*
780 | Mark INF_MEMSYM cones |
781 *----------------------------------------------------------------------------*/
783 if (inf_GetPointer(ifl
, INF_MEMSYM
, "", (void **)&list0
)) {
784 for (ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
785 ptsig
= (losig_list
*)getptype(ptcone
->USER
, CNS_SIGNAL
)->DATA
;
786 for (ptchain
= list0
; ptchain
; ptchain
= ptchain
->NEXT
) {
787 if (mbk_LosigTestREGEX(ptsig
, ((inf_assoc
*)ptchain
->DATA
)->orig
)) {
788 ptcone
->TYPE
|= CNS_MEMSYM
;
790 if (mbk_LosigTestREGEX(ptsig
, ((inf_assoc
*)ptchain
->DATA
)->dest
)) {
791 ptcone
->TYPE
|= CNS_MEMSYM
;
797 /*---------------------------------------------------------------------------*
798 | Mark INF_MODELLOOP cones |
799 *----------------------------------------------------------------------------*/
801 list0
=inf_GetEntriesByType(ifl
, INF_MODELLOOP
, INF_YES
);
802 list1
=inf_GetEntriesByType(ifl
, INF_MODELLOOP
, INF_NO
);
803 if (list0
!= NULL
|| list1
!= NULL
) {
804 for (ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
805 ptsig
= (losig_list
*)getptype(ptcone
->USER
, CNS_SIGNAL
)->DATA
;
806 for (ptchain
= list0
; ptchain
; ptchain
= ptchain
->NEXT
) {
807 if (mbk_LosigTestREGEX(ptsig
, (char *)ptchain
->DATA
)) {
808 if ((ptuser
= getptype(ptcone
->USER
, YAG_INFO_PTYPE
)) != NULL
) {
809 ptuser
->DATA
= (void *)((long)ptuser
->DATA
| YAG_INFOMODELLOOP
);
811 else ptcone
->USER
= addptype(ptcone
->USER
, YAG_INFO_PTYPE
, (void *)YAG_INFOMODELLOOP
);
814 for (ptchain
= list1
; ptchain
; ptchain
= ptchain
->NEXT
) {
815 if (mbk_LosigTestREGEX(ptsig
, (char *)ptchain
->DATA
)) {
816 if ((ptuser
= getptype(ptcone
->USER
, YAG_INFO_PTYPE
)) != NULL
) {
817 ptuser
->DATA
= (void *)((long)ptuser
->DATA
| YAG_INFONOTMODELLOOP
);
819 else ptcone
->USER
= addptype(ptcone
->USER
, YAG_INFO_PTYPE
, (void *)YAG_INFONOTMODELLOOP
);
827 /*---------------------------------------------------------------------------*
828 | Chain the transistor gates to the driving cone |
829 *----------------------------------------------------------------------------*/
831 for (pttrans
= ptcnsfig
->LOTRS
; pttrans
!= NULL
; pttrans
= pttrans
->NEXT
) {
832 yagChainTrans(pttrans
);
835 /*---------------------------------------------------------------------------*
836 | Reset the BDD toolbox |
837 *----------------------------------------------------------------------------*/
841 /*---------------------------------------------------------------------------*
842 | Chaining of CMOS dual cones |
843 *----------------------------------------------------------------------------*/
845 for (ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
846 if ((ptcone
->TECTYPE
& CNS_DUAL_CMOS
) != 0) {
847 yagChainDual(ptcone
);
848 if (yagDetectTransfer(ptcone
)) {
849 yagChainCone(ptcone
);
850 ptcone
->TYPE
&= ~YAG_HASDUAL
;
851 cnsConeFunction(ptcone
, FALSE
);
856 /*---------------------------------------------------------------------------*
857 | Mark inversion substitution for switches |
858 *----------------------------------------------------------------------------*/
860 yagAddSwitchInversion(ptcnsfig
);
862 /*---------------------------------------------------------------------------*
863 | Bleeder Detection |
864 *----------------------------------------------------------------------------*/
866 yagChrono(&START
,&start
);
867 if (!YAG_CONTEXT
->YAG_SILENT_MODE
) yagMessage(MES_BLEED_EXTRACT
,NULL
);
868 for (ptcone
= ptcnsfig
->CONE
; ptcone
; ptcone
= ptcone
->NEXT
) {
869 if ((ptcone
->TECTYPE
& CNS_DUAL_CMOS
) != 0) {
870 count
= yagCountActiveEdges(ptcone
->INCONE
);
871 if (count
== 1 || (count
== 2 && YAG_CONTEXT
->YAG_BLEEDER_STRICTNESS
< 2)) {
872 yagExtractBleeder(ifl
, ptcone
);
876 yagChrono(&END
,&end
);
877 if (!YAG_CONTEXT
->YAG_SILENT_MODE
) yagPrintTime(&START
,&END
,start
,end
);
879 /*---------------------------------------------------------------------------*
880 | Chaining of temporary cones |
881 *----------------------------------------------------------------------------*/
882 #ifdef DELAY_DEBUG_STAT
883 mbk_debugstat (NULL
, 1);
886 ptuser
= getptype(ptcnsfig
->USER
, YAG_TEMPCONE_PTYPE
);
887 if (ptuser
!= NULL
) {
888 for (ptcone
= (cone_list
*)ptuser
->DATA
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
889 yagChainDual(ptcone
);
892 #ifdef DELAY_DEBUG_STAT
893 mbk_debugstat ("chaindual:", 0);
896 /*---------------------------------------------------------------------------*
897 | Parallel branch and transistor detection on CMOS dual cones |
898 *----------------------------------------------------------------------------*/
900 for (ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
901 if ((ptcone
->TECTYPE
& CNS_DUAL_CMOS
) != 0) {
902 yagDetectParallelBranches(ptcone
);
903 yagDetectParaTrans(ptcone
);
907 #ifdef DELAY_DEBUG_STAT
908 mbk_debugstat ("detect // branches:", 0);
911 /*---------------------------------------------------------------------------*
912 | Mark INF_CONSTRAINT cones and connectors |
913 *----------------------------------------------------------------------------*/
915 list0
=inf_GetEntriesByType(ifl
, INF_STUCK
, (char *)(long)0);
916 list1
=inf_GetEntriesByType(ifl
, INF_STUCK
, (char *)(long)1);
917 if (list0
!= NULL
|| list1
!=NULL
) {
918 for (ptcon
= ptcnsfig
->LOCON
; ptcon
; ptcon
= ptcon
->NEXT
) {
919 for (ptchain
=list0
; ptchain
!=NULL
; ptchain
=ptchain
->NEXT
) {
920 if (mbk_TestREGEX(ptcon
->NAME
, (char *)ptchain
->DATA
) || mbk_LosigTestREGEX(ptcon
->SIG
, (char *)ptchain
->DATA
)) {
921 if ((ptuser
= getptype(ptcon
->USER
, CNS_TYPELOCON
)) != NULL
) {
922 ptuser
->DATA
= (void *)((long)ptuser
->DATA
| CNS_ZERO
);
924 else ptcon
->USER
= addptype(ptcon
->USER
, CNS_TYPELOCON
, (void *)CNS_ZERO
);
927 for (ptchain
=list1
; ptchain
!=NULL
; ptchain
=ptchain
->NEXT
) {
928 if (mbk_TestREGEX(ptcon
->NAME
, (char *)ptchain
->DATA
) || mbk_LosigTestREGEX(ptcon
->SIG
, (char *)ptchain
->DATA
)) {
929 if ((ptuser
= getptype(ptcon
->USER
, CNS_TYPELOCON
)) != NULL
) {
930 ptuser
->DATA
= (void *)((long)ptuser
->DATA
| CNS_ONE
);
932 else ptcon
->USER
= addptype(ptcon
->USER
, CNS_TYPELOCON
, (void *)CNS_ONE
);
936 for (ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
937 ptsig
= (losig_list
*)getptype(ptcone
->USER
, CNS_SIGNAL
)->DATA
;
938 for (ptchain
=list0
; ptchain
!=NULL
; ptchain
=ptchain
->NEXT
) {
939 if (mbk_TestREGEX(ptcone
->NAME
, (char *)ptchain
->DATA
) || mbk_LosigTestREGEX(ptsig
, (char *)ptchain
->DATA
)) {
940 ptcone
->TECTYPE
|= CNS_ZERO
;
941 ptcone
->TYPE
|= YAG_FORCEPRIM
;
942 ptcone
->TYPE
&= ~YAG_PARTIAL
;
945 for (ptchain
=list1
; ptchain
!=NULL
; ptchain
=ptchain
->NEXT
) {
946 if (mbk_TestREGEX(ptcone
->NAME
, (char *)ptchain
->DATA
) || mbk_LosigTestREGEX(ptsig
, (char *)ptchain
->DATA
)) {
947 ptcone
->TECTYPE
|= CNS_ONE
;
948 ptcone
->TYPE
|= YAG_FORCEPRIM
;
949 ptcone
->TYPE
&= ~YAG_PARTIAL
;
957 #ifdef DELAY_DEBUG_STAT
958 mbk_debugstat ("stuck:", 0);
961 /*---------------------------------------------------------------------------*
962 | Propagate stuck-at values |
963 *----------------------------------------------------------------------------*/
965 for(ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
966 yagBuildOutputs(ptcone
);
971 for(ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
972 if ((ptcone
->TECTYPE
& (CNS_ZERO
|CNS_ONE
)) != 0) {
973 if (yagPropagateStuck(ptcone
)) changes
= TRUE
;
978 #ifdef DELAY_DEBUG_STAT
979 mbk_debugstat ("propstuck:", 0);
982 /*---------------------------------------------------------------------------*
983 | Building of global graph |
984 *----------------------------------------------------------------------------*/
986 for (ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
987 if ((ptcone
->TYPE
& YAG_PARTIAL
) != 0) {
989 ptinputs
= yagGetConeInputs(ifl
, ptcone
);
990 ptcone
->USER
= addptype(ptcone
->USER
, YAG_INPUTS_PTYPE
, ptinputs
);
994 ptuser
= getptype(ptcnsfig
->USER
, YAG_GLUECONE_PTYPE
);
995 if (ptuser
!= NULL
) {
996 for (ptcone
= (cone_list
*)ptuser
->DATA
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
997 ptinputs
= yagGetConeInputs(ifl
, ptcone
);
998 ptcone
->USER
= addptype(ptcone
->USER
, YAG_INPUTS_PTYPE
, ptinputs
);
1001 #ifdef DELAY_DEBUG_STAT
1002 mbk_debugstat ("global graph:", 0);
1005 /*---------------------------------------------------------------------------*
1006 | Detect two cone loops in global graph |
1007 *----------------------------------------------------------------------------*/
1009 for (ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
1010 yagMarkLoopConf(ptcone
);
1013 #ifdef DELAY_DEBUG_STAT
1014 mbk_debugstat ("detect loop:", 0);
1017 /*---------------------------------------------------------------------------*
1018 | Contraint initialisation |
1019 *----------------------------------------------------------------------------*/
1021 yagInitConstraints(ifl
);
1023 /*---------------------------------------------------------------------------*
1024 | Mark multi-voltage |
1025 *----------------------------------------------------------------------------*/
1028 if (YAG_CONTEXT
->YAG_USESTMSOLVER
) {
1029 for (ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
1030 yagPrepStmSolver(ptcone
);
1034 #ifdef DELAY_DEBUG_STAT
1035 mbk_debugstat ("init constraint + solver:", 0);
1038 /*---------------------------------------------------------------------------*
1039 | Glitcher detection in CMOS Duals |
1040 *----------------------------------------------------------------------------*/
1042 if (V_INT_TAB
[__YAGLE_KEEP_GLITCHERS
].VALUE
== 2) {
1043 for (ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
1044 yagDetectDualGlitcherBranches(ptcone
);
1048 /*---------------------------------------------------------------------------*
1049 | Building the cones |
1050 *----------------------------------------------------------------------------*/
1052 YAG_CONTEXT
->YAG_REQUIRE_COMPLETE_GRAPH
= TRUE
;
1053 yagChrono(&START
,&start
);
1054 if (!YAG_CONTEXT
->YAG_SILENT_MODE
) yagMessage(MES_MAKING_GATES
, NULL
);
1055 YAG_CONTEXT
->YAG_ITERATIONS
= 0;
1056 conesleft
= numpartial
;
1057 while (conesleft
!= 0) {
1058 previous
= conesleft
;
1059 conesleft
= yagScanCones(ifl
, ptcnsfig
->CONE
);
1060 if (previous
== conesleft
) {
1061 YAG_CONTEXT
->YAG_MAX_LINKS
= YAG_CONTEXT
->YAG_RELAX_LINKS
;
1062 if (YAG_CONTEXT
->YAG_RELAX_ALGO
) {
1063 YAG_CONTEXT
->YAG_USE_FCF
= FALSE
;
1065 else YAG_CONTEXT
->YAG_REQUIRE_COMPLETE_GRAPH
= FALSE
;
1069 yagChrono(&END
,&end
);
1070 if (!YAG_CONTEXT
->YAG_SILENT_MODE
) yagPrintTime(&START
,&END
,start
,end
);
1072 /*---------------------------------------------------------------------------*
1073 | Delete cells containing no cones and no befig |
1074 *----------------------------------------------------------------------------*/
1076 for (ptcell
= ptcnsfig
->CELL
; ptcell
; ptcell
= ptnextcell
) {
1077 ptnextcell
= ptcell
->NEXT
;
1078 if (ptcell
->CONES
== NULL
&& ptcell
->BEFIG
== NULL
) {
1079 ptcnsfig
->CELL
= delcell(ptcnsfig
->CELL
, ptcell
);
1083 /*---------------------------------------------------------------------------*
1084 | Final pre-relaxation loop analysis and standard latch detection |
1085 *----------------------------------------------------------------------------*/
1087 if (YAG_CONTEXT
->YAG_LOOP_ANALYSIS
|| YAG_CONTEXT
->YAG_DETECT_LATCHES
|| YAG_CONTEXT
->YAG_SIMPLE_LATCH
) {
1088 yagChrono(&START
,&start
);
1089 if (!YAG_CONTEXT
->YAG_SILENT_MODE
) yagMessage(MES_LATCH_DETECTION
, NULL
);
1092 if (YAG_CONTEXT
->YAG_SIMPLE_LATCH
) {
1093 for (ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
1094 yagMatchSimpleLatch(ptcone
);
1098 if (YAG_CONTEXT
->YAG_LOOP_ANALYSIS
) {
1099 for (ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
1100 if (yagDetectFalseConf(ptcone
)) yagChainCone(ptcone
);
1101 yagAnalyseLoop(ptcone
, TRUE
);
1105 for (ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
1106 if (yagDetectFalseConf(ptcone
)) ptcone
->TYPE
|= YAG_MARK
;
1107 yagRmvThruLatch(ptcone
);
1108 yagRmvThruBleed(ptcone
);
1109 if ((ptcone
->TYPE
& YAG_MARK
) != 0) {
1111 if ((ptcone
->TYPE
& YAG_AUTOLATCH
) != 0) {
1112 yagUnmarkLatch(ptcone
, FALSE
, FALSE
);
1114 yagChainCone(ptcone
);
1115 yagAnalyseCone(ptcone
);
1116 ptcone
->TYPE
&= ~YAG_MARK
;
1122 if (YAG_CONTEXT
->YAG_DETECT_LATCHES
) {
1123 for (ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
1124 if ((ptcone
->TYPE
& (CNS_LATCH
|CNS_MEMSYM
|CNS_RS
|CNS_PRECHARGE
)) == 0
1125 && ptcone
->CELLS
== NULL
&& (ptcone
->TECTYPE
& YAG_NOTLATCH
) == 0) {
1126 yagMatchLatch(ptcone
);
1129 for (ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
1130 if ((ptcone
->TYPE
& YAG_FALSECONF
) != 0) {
1131 yagRmvThruLatch(ptcone
);
1132 yagChainCone(ptcone
);
1134 if ((ptcone
->TYPE
& YAG_LOOPCONF
) != 0) {
1135 yagDetectLoopConf(ptcone
);
1138 for (ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptnextcone
) {
1139 ptnextcone
= ptcone
->NEXT
;
1140 if ((ptcone
->TYPE
& YAG_MARK
) == YAG_MARK
) {
1141 yagAnalyseCone(ptcone
);
1142 ptcone
->TYPE
&= ~YAG_MARK
;
1147 if (YAG_CONTEXT
->YAG_LOOP_ANALYSIS
|| YAG_CONTEXT
->YAG_DETECT_LATCHES
) {
1148 yagChrono(&END
,&end
);
1149 if (!YAG_CONTEXT
->YAG_SILENT_MODE
) yagPrintTime(&START
,&END
,start
,end
);
1152 /*---------------------------------------------------------------------------*
1153 | Bleeder Detection |
1154 *----------------------------------------------------------------------------*/
1155 for (ptcone
= ptcnsfig
->CONE
; ptcone
; ptcone
= ptcone
->NEXT
) {
1156 if ((ptcone
->TYPE
& (CNS_LATCH
|CNS_MEMSYM
|CNS_RS
|CNS_MASTER
|CNS_SLAVE
)) != 0) continue;
1157 yagDetectBleeder(ptcone
);
1159 for (ptcone
= ptcnsfig
->CONE
; ptcone
; ptcone
= ptcone
->NEXT
) {
1160 if ((ptcone
->TYPE
& YAG_FALSECONF
) != 0) {
1161 yagRmvThruBleed(ptcone
);
1163 if ((ptcone
->TYPE
& YAG_LOOPCONF
) != 0) {
1164 yagDetectLoopConf(ptcone
);
1166 if ((ptcone
->TYPE
& YAG_MARK
) != 0) {
1167 yagChainCone(ptcone
);
1168 yagAnalyseCone(ptcone
);
1169 ptcone
->TYPE
&= ~YAG_MARK
;
1174 /*---------------------------------------------------------------------------*
1175 | Select a latch in symmetric registers |
1176 *----------------------------------------------------------------------------*/
1178 /* pair off CNS_MEMSYM cones */
1179 for (ptcone
= ptcnsfig
->CONE
; ptcone
; ptcone
= ptcone
->NEXT
) {
1180 if ((ptcone
->TYPE
& CNS_MEMSYM
) != 0) {
1181 if (getptype(ptcone
->USER
, YAG_MEMORY_PTYPE
) == NULL
) {
1182 yagPairMemsym(ifl
, ptcone
);
1184 if (getptype(ptcone
->USER
, YAG_MEMORY_PTYPE
) == NULL
) {
1185 ptcone
->TYPE
&= ~CNS_MEMSYM
;
1190 /*---------------------------------------------------------------------------*
1191 | Update two-cone loop marks and re-verify if necessary |
1192 *----------------------------------------------------------------------------*/
1194 for (ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
1195 yagDetectLoopConf(ptcone
);
1197 for (ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
1198 if ((ptcone
->TYPE
& YAG_FALSECONF
) != 0) {
1199 yagDetectFalseConf(ptcone
);
1200 if ((ptcone
->TYPE
& YAG_FALSECONF
) == 0) {
1201 yagChainCone(ptcone
);
1202 yagAnalyseCone(ptcone
);
1207 /*---------------------------------------------------------------------------*
1208 | Desb-like relaxation |
1209 *----------------------------------------------------------------------------*/
1210 if (relax
== TRUE
) {
1211 yagChrono(&START
,&start
);
1212 if (!YAG_CONTEXT
->YAG_SILENT_MODE
) yagMessage(MES_RELAX
, NULL
);
1213 YAG_CONTEXT
->YAG_USE_FCF
= TRUE
;
1215 YAG_CONTEXT
->YAG_ITERATIONS
= 1;
1217 avt_log(LOGYAG
,1, "Starting relaxation iteration %d\n\n", YAG_CONTEXT
->YAG_ITERATIONS
++);
1218 changes
= yagDepthFirstProcess(ptcnsfig
->CONE
, yagRemoveFalseBranches
);
1220 yagChrono(&END
,&end
);
1221 if (!YAG_CONTEXT
->YAG_SILENT_MODE
) yagPrintTime(&START
,&END
,start
,end
);
1224 /*---------------------------------------------------------------------------*
1225 | Mark non-functional external branches |
1226 *----------------------------------------------------------------------------*/
1227 #ifdef DELAY_DEBUG_STAT
1228 mbk_debugstat (NULL
, 1);
1231 for(ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
1232 if (ptcone
->BREXT
!= NULL
) yagRmvFalseBrext(ptcone
);
1235 #ifdef DELAY_DEBUG_STAT
1236 mbk_debugstat ("remove false branch:", 0);
1239 /*---------------------------------------------------------------------------*
1240 | Loop Analysis after relaxation |
1241 *----------------------------------------------------------------------------*/
1243 if (YAG_CONTEXT
->YAG_LOOP_ANALYSIS
) {
1244 int changed
= FALSE
;
1245 for (ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
1246 count
= yagCountLoops(ptcone
, FALSE
);
1248 yagAnalyseLoop(ptcone
, FALSE
);
1250 ptcone
->TYPE
|= YAG_MARK
;
1254 for (ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
1255 if ((ptcone
->TYPE
& YAG_FALSECONF
) != 0) {
1256 yagRmvThruLatch(ptcone
);
1257 yagChainCone(ptcone
);
1259 if ((ptcone
->TYPE
& YAG_LOOPCONF
) != 0) {
1260 yagDetectLoopConf(ptcone
);
1263 for (ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptnextcone
) {
1264 ptnextcone
= ptcone
->NEXT
;
1265 if ((ptcone
->TYPE
& YAG_MARK
) == YAG_MARK
) {
1266 yagAnalyseCone(ptcone
);
1267 ptcone
->TYPE
&= ~YAG_MARK
;
1272 #ifdef DELAY_DEBUG_STAT
1273 mbk_debugstat ("loop analysis:", 0);
1276 /*---------------------------------------------------------------------------*
1277 | Final check for any FALSECONF and DEGRADED |
1278 *----------------------------------------------------------------------------*/
1280 for(ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
1281 yagDetectDegraded(ptcone
);
1282 if ((ptcone
->TYPE
& YAG_FALSECONF
) == YAG_FALSECONF
) yagAnalyseCone(ptcone
);
1284 #ifdef DELAY_DEBUG_STAT
1285 mbk_debugstat ("false conf:", 0);
1288 /*---------------------------------------------------------------------------*
1289 | check for poor redundant branches (partly heuristic) |
1290 *----------------------------------------------------------------------------*/
1292 if (YAG_CONTEXT
->YAG_DETECT_REDUNDANT
) {
1293 for(ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
1294 if ((ptcone
->TECTYPE
& CNS_DUAL_CMOS
) != CNS_DUAL_CMOS
) {
1295 yagDetectRedundant(ptcone
);
1296 yagDetectDegraded(ptcone
);
1301 /*---------------------------------------------------------------------------*
1302 | Correction for switch transistor |
1303 *----------------------------------------------------------------------------*/
1305 for(ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
1306 yagCorrectSwitch(ptcone
);
1309 /*---------------------------------------------------------------------------*
1310 | Chain cone outputs |
1311 *----------------------------------------------------------------------------*/
1313 for(ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
1314 if (ptcone
->OUTCONE
) {
1315 yagFreeEdgeList(ptcone
->OUTCONE
);
1316 ptcone
->OUTCONE
= NULL
;
1319 for(ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
1320 yagBuildOutputs(ptcone
);
1323 /*---------------------------------------------------------------------------*
1324 | Check possible input cones |
1325 *----------------------------------------------------------------------------*/
1327 for(ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptnextcone
) {
1328 ptnextcone
= ptcone
->NEXT
;
1329 yagCheckExtOut(ptcone
);
1330 yagCheckExtIn(ptcone
);
1333 /*---------------------------------------------------------------------------*
1334 | Remove empty cones unless in NOTSTRICT mode |
1335 *----------------------------------------------------------------------------*/
1337 for(ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptnextcone
) {
1338 ptnextcone
= ptcone
->NEXT
;
1339 if ((ptcone
->TYPE
& CNS_VDD
) == CNS_VDD
) continue;
1340 if ((ptcone
->TYPE
& CNS_VSS
) == CNS_VSS
) continue;
1341 if ((ptcone
->TECTYPE
& (CNS_ONE
|CNS_ZERO
)) != 0 && ptcone
->OUTCONE
!= NULL
) continue;
1342 if (ptcone
->OUTCONE
!= NULL
&& YAG_CONTEXT
->YAG_NOTSTRICT
) continue;
1343 if (yagCheckBranches(ptcone
) == FALSE
) {
1344 yagResetCone(ptcone
);
1345 CNS_HEADCNSFIG
->CONE
= delcone(CNS_HEADCNSFIG
->CONE
, ptcone
);
1349 /*---------------------------------------------------------------------------*
1350 | Select a latch in bistables (after building OUTCONE list ) |
1351 *----------------------------------------------------------------------------*/
1353 if ((YAG_CONTEXT
->YAG_AUTO_RS
& YAG_RS_LATCH
) != 0) {
1354 for (ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
1355 if ((ptcone
->TYPE
&(CNS_RS
|CNS_LATCH
)) == CNS_RS
) {
1356 ptsymcone
= (cone_list
*)getptype(ptcone
->USER
, YAG_BISTABLE_PTYPE
)->DATA
;
1357 if ((ptsymcone
->TYPE
&(CNS_RS
|CNS_LATCH
)) == CNS_RS
) {
1358 yagSelectRSLatch(ptcone
, ptsymcone
);
1364 /*---------------------------------------------------------------------------*
1365 | Disable the appropriate timing arcs |
1366 *----------------------------------------------------------------------------*/
1368 if (YAG_CONTEXT
->YAG_AUTO_RS
) {
1369 for (ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
1370 if ((ptcone
->TYPE
& (CNS_RS
|YAG_MARK
)) == CNS_RS
) {
1371 ptsymcone
= (cone_list
*)getptype(ptcone
->USER
, YAG_BISTABLE_PTYPE
)->DATA
;
1372 type
= ptcone
->TECTYPE
& (CNS_NAND
|CNS_NOR
);
1374 yagDisableRSArcs(ptcone
, ptsymcone
, ptcone
, ptsymcone
, type
, (YAG_CONTEXT
->YAG_AUTO_RS
& (YAG_RS_LEGAL
|YAG_RS_ILLEGAL
)));
1376 ptsymcone
->TYPE
|= YAG_MARK
;
1378 ptcone
->TYPE
&= ~YAG_MARK
;
1382 /*---------------------------------------------------------------------------*
1384 *----------------------------------------------------------------------------*/
1386 for(ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
1387 yagDetectLoops(ptcone
);
1390 /*---------------------------------------------------------------------------*
1391 | Build glue cones for befig |
1392 *----------------------------------------------------------------------------*/
1394 if ((mode
& YAG_GENBEFIG
) != 0) {
1395 if ((ptuser
= getptype(ptcnsfig
->USER
, YAG_GLUECONE_PTYPE
)) != NULL
) {
1396 for (ptcone
= (cone_list
*)ptuser
->DATA
; ptcone
; ptcone
= ptcone
->NEXT
) {
1397 yagExpandCone(ifl
, ptcone
);
1402 /*---------------------------------------------------------------------------*
1404 *----------------------------------------------------------------------------*/
1406 if (YAG_CONTEXT
->YAG_MAKE_CELLS
|| YAG_CONTEXT
->YAG_AUTO_FLIPFLOP
) {
1407 yagChrono(&START
,&start
);
1408 if (!YAG_CONTEXT
->YAG_SILENT_MODE
) yagMessage(MES_MAKING_CELLS
, NULL
);
1409 build_befig
= ((mode
& (YAG_GENBEFIG
|YAG_GENLOFIG
)) != 0);
1410 if (YAG_CONTEXT
->YAG_MAKE_CELLS
) yagMatchFlipFlopCells(ptcnsfig
->CONE
, build_befig
);
1411 if (YAG_CONTEXT
->YAG_AUTO_FLIPFLOP
) yagAutoFlipFlop(ptcnsfig
->CONE
, build_befig
);
1412 yagChrono(&END
,&end
);
1413 if (!YAG_CONTEXT
->YAG_SILENT_MODE
) yagPrintTime(&START
,&END
,start
,end
);
1415 #ifdef DELAY_DEBUG_STAT
1416 mbk_debugstat ("reste:", 0);
1419 /*---------------------------------------------------------------------------*
1421 *----------------------------------------------------------------------------*/
1423 if (YAG_CONTEXT
->YAG_DELAYED_RS
) {
1424 yagDetectDelayedRS(ptcnsfig
);
1427 /*---------------------------------------------------------------------------*
1428 | External connector verification |
1429 *----------------------------------------------------------------------------*/
1431 yagChrono(&START
,&start
);
1432 if (!YAG_CONTEXT
->YAG_SILENT_MODE
) yagMessage(MES_VERIF_EXTCON
, NULL
);
1433 yagOrientInterface(ptcnsfig
);
1434 yagChrono(&END
,&end
);
1435 if (!YAG_CONTEXT
->YAG_SILENT_MODE
) yagPrintTime(&START
,&END
,start
,end
);
1437 #ifdef AVERTEC_LICENSE
1438 if(avt_givetoken("YAGLE_LICENSE_SERVER", YAG_CONTEXT
->YAGLE_TOOLNAME
)!=AVT_VALID_TOKEN
) EXIT(1);
1441 /*---------------------------------------------------------------------------*
1442 | Check transistor usage |
1443 *----------------------------------------------------------------------------*/
1445 for (pttrans
= ptmbkfig
->LOTRS
; pttrans
!= NULL
; pttrans
= pttrans
->NEXT
) {
1446 pttrans
->TYPE
&= ~USED
;
1448 for(ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
1449 yagMarkUsedTrans(ptcone
);
1452 for (pttrans
= ptmbkfig
->LOTRS
; pttrans
!= NULL
; pttrans
= pttrans
->NEXT
) {
1453 if ((ptuser
= getptype(pttrans
->USER
, FCL_TRANSFER_PTYPE
)) != NULL
) {
1454 if (((long)ptuser
->DATA
& FCL_NEVER
) != 0) continue;
1456 if ((pttrans
->TYPE
& USED
) == 0) {
1457 pttrans
->USER
= addptype(pttrans
->USER
, CNS_UNUSED
, NULL
);
1458 if ((pttrans
->TYPE
& CNS_TN
) != 0) {
1459 yagWarning(WAR_UNUSED
,NULL
,"N",(char*)pttrans
,0);
1462 yagWarning(WAR_UNUSED
,NULL
,"P",(char*)pttrans
,0);
1467 if (getptype(pttrans
->USER
, CNS_DRIVINGCONE
)->DATA
== NULL
) {
1468 ptsig
= ((locon_list
*)getptype(pttrans
->USER
, YAG_GRIDCON_PTYPE
)->DATA
)->SIG
;
1469 yagError(ERR_GATE_UNDRIVEN
, NULL
, ptsig
->NAMECHAIN
->DATA
, NULL
, 0, 0);
1473 if (getptype(pttrans
->USER
, YAG_BIDIR_PTYPE
) != NULL
) {
1474 yagWarning(WAR_BIDIR_BLOCKED
, NULL
, "N", (char*)pttrans
, 0);
1477 pttrans
->TYPE
&= (TRANSN
|TRANSP
);
1479 if (YAG_CONTEXT
->YAG_STAT_MODE
) {
1480 fprintf(YAG_CONTEXT
->YAGLE_STAT_FILE
, "------------------------------------------------------------\n");
1481 if (num_unused
> 0) fprintf(YAG_CONTEXT
->YAGLE_STAT_FILE
, "%d unused transistors\n", num_unused
);
1482 if (num_undrivengate
> 0) fprintf(YAG_CONTEXT
->YAGLE_STAT_FILE
, "%d undriven transistor gates\n", num_undrivengate
);
1483 if (num_bidir
> 0) fprintf(YAG_CONTEXT
->YAGLE_STAT_FILE
, "%d potentially bidirectional transistors\n", num_bidir
);
1486 /*---------------------------------------------------------------------------*
1488 *----------------------------------------------------------------------------*/
1490 yagChrono(&START
,&start
);
1491 if (!YAG_CONTEXT
->YAG_SILENT_MODE
) yagMessage(MES_FIG_CHECKING
, NULL
);
1493 for(ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
1494 ptcone
->INDEX
= index
++;
1496 if ((ptcone
->TYPE
& (CNS_VDD
|CNS_VSS
)) != 0) continue;
1497 if ((ptcone
->TECTYPE
& CNS_DUAL_CMOS
) == CNS_DUAL_CMOS
) num_cmosdual
++;
1498 if ((ptcone
->TECTYPE
& CNS_ZERO
) == CNS_ZERO
) {
1499 yagWarning(WAR_STUCK_ZERO
, NULL
, ptcone
->NAME
, NULL
, 0);
1502 if ((ptcone
->TECTYPE
& CNS_ONE
) == CNS_ONE
) {
1503 yagWarning(WAR_STUCK_ONE
, NULL
, ptcone
->NAME
, NULL
, 0);
1507 count
= yagCountLoops(ptcone
, FALSE
);
1508 if (count
> 0 && YAG_CONTEXT
->YAG_LOOP_ANALYSIS
) {
1509 yagAnalyseLoop(ptcone
, FALSE
);
1512 if ((ptcone
->TECTYPE
& YAG_LEVELHOLD
) != 0) {
1514 yagWarning(WAR_LEVELHOLD_LOOP
, NULL
, ptcone
->NAME
, NULL
, 0);
1516 else if (getptype(ptcone
->USER
, CNS_BLEEDER
) != NULL
) {
1518 yagWarning(WAR_BLEED_LOOP
, NULL
, ptcone
->NAME
, NULL
, 0);
1520 if ((ptcone
->TECTYPE
& YAG_BADCONE
) != 0) {
1522 yagWarning(WAR_BADCONE
, NULL
, ptcone
->NAME
, NULL
, 0);
1524 if ((ptcone
->TYPE
& CNS_LATCH
) != 0 && (ptcone
->TYPE
& CNS_RS
) == 0) {
1526 ptuser
= getptype(ptcone
->USER
, YAG_LATCHINFO_PTYPE
);
1527 if (ptuser
!= NULL
) info
= (long)ptuser
->DATA
;
1528 if (info
== DLATCH
) num_dlatch
++;
1530 if (ptcone
->CELLS
!= NULL
) ptcell
= (cell_list
*)ptcone
->CELLS
->DATA
;
1532 if ((ptcone
->TYPE
& CNS_MASTER
) == CNS_MASTER
) {
1533 yagWarning(WAR_MASTER_LATCH_LOOP
, (char *)ptcell
, ptcone
->NAME
, (char *)ptcone
->INDEX
, info
);
1535 else if ((ptcone
->TYPE
& CNS_SLAVE
) == CNS_SLAVE
) {
1536 yagWarning(WAR_SLAVE_LATCH_LOOP
, (char *)ptcell
, ptcone
->NAME
, (char *)ptcone
->INDEX
, info
);
1538 else yagWarning(WAR_LATCH_LOOP
, (char *)ptcell
, ptcone
->NAME
, (char *)ptcone
->INDEX
, info
);
1540 if ((ptcone
->TYPE
& (CNS_RS
)) == (CNS_RS
)) {
1541 if (getptype(ptcone
->USER
, YAG_MARK_PTYPE
) != NULL
) {
1542 ptcone
->USER
= delptype(ptcone
->USER
, YAG_MARK_PTYPE
);
1546 ptloopcone
= (cone_list
*)getptype(ptcone
->USER
, YAG_BISTABLE_PTYPE
)->DATA
;
1547 yagWarning(WAR_BISTABLE_LOOP
, ptcone
->NAME
, ptloopcone
->NAME
, NULL
, 0);
1548 ptloopcone
->USER
= addptype(ptloopcone
->USER
, YAG_MARK_PTYPE
, 0);
1551 if ((ptcone
->TYPE
& CNS_FLIP_FLOP
) != 0) {
1553 yagWarning(WAR_FLIP_FLOP_LOOP
, (char *)ptcell
, ptcone
->NAME
, (char *)ptcone
->INDEX
, 0);
1555 if ((ptcone
->TYPE
& CNS_PRECHARGE
) != 0) {
1557 yagWarning(WAR_PRECHARGE
, NULL
, ptcone
->NAME
, (char *)ptcone
->INDEX
, 0);
1559 if ((ptcone
->TYPE
& CNS_CONFLICT
) != 0) {
1561 if (getptype(ptcone
->USER
, YAG_LATCHBEFIG_PTYPE
) != NULL
) {
1562 yagWarning(WAR_LATCH_CONFLICT
, NULL
, ptcone
->NAME
, NULL
, 0);
1564 else if (getptype(ptcone
->USER
, YAG_BUSBEFIG_PTYPE
) != NULL
) {
1565 yagWarning(WAR_BUS_CONFLICT
, NULL
, ptcone
->NAME
, NULL
, 0);
1567 else yagWarning(WAR_CONFLICT
, NULL
, ptcone
->NAME
, NULL
, 0);
1569 if ((ptcone
->TYPE
& CNS_TRI
) != 0) {
1571 if (getptype(ptcone
->USER
, YAG_LATCHBEFIG_PTYPE
) != NULL
) {
1572 yagWarning(WAR_LATCH_HZ
, NULL
, ptcone
->NAME
, NULL
, 0);
1574 else yagWarning(WAR_HZ
, NULL
, ptcone
->NAME
, NULL
, 0);
1576 if (!stuck
&& ptcone
->OUTCONE
== NULL
) {
1578 yagWarning(WAR_DOESNT_DRIVE
, NULL
, ptcone
->NAME
, NULL
, 0);
1580 if (ptcone
->INCONE
== NULL
) {
1582 yagWarning(WAR_NO_INPUTS
, NULL
, ptcone
->NAME
, NULL
, 0);
1585 for(ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
1586 num_loops
+= yagCountLoops(ptcone
, TRUE
);
1588 yagChrono(&END
,&end
);
1589 if (!YAG_CONTEXT
->YAG_SILENT_MODE
) yagPrintTime(&START
,&END
,start
,end
);
1590 if (YAG_CONTEXT
->YAG_STAT_MODE
) {
1591 fprintf(YAG_CONTEXT
->YAGLE_STAT_FILE
, "------------------------------------------------------------\n");
1592 if (num_bad
> 0) fprintf(YAG_CONTEXT
->YAGLE_STAT_FILE
, "%d cones contain long current paths (Check MUTEX constraints)\n", num_bad
);
1593 if (num_bleeder
> 0) fprintf(YAG_CONTEXT
->YAGLE_STAT_FILE
, "%d bleeder loops\n", num_bleeder
);
1594 if (num_levelhold
> 0) fprintf(YAG_CONTEXT
->YAGLE_STAT_FILE
, "%d level-hold loops\n", num_levelhold
);
1595 if (num_latch
> 0) fprintf(YAG_CONTEXT
->YAGLE_STAT_FILE
, "%d latches\n", num_latch
);
1596 if (num_dlatch
> 0) fprintf(YAG_CONTEXT
->YAGLE_STAT_FILE
, "%d dynamic latches\n", num_dlatch
);
1597 if (num_precharge
> 0) fprintf(YAG_CONTEXT
->YAGLE_STAT_FILE
, "%d precharged signals\n", num_precharge
);
1598 if (num_rs
> 0) fprintf(YAG_CONTEXT
->YAGLE_STAT_FILE
, "%d RS bistables\n", num_rs
);
1599 if (num_flipflop
> 0) fprintf(YAG_CONTEXT
->YAGLE_STAT_FILE
, "%d flip-flops\n", num_flipflop
);
1600 if (num_loops
> 0) fprintf(YAG_CONTEXT
->YAGLE_STAT_FILE
, "%d unknown loops\n", num_loops
);
1601 if (num_noinputs
> 0) fprintf(YAG_CONTEXT
->YAGLE_STAT_FILE
, "%d signals without drivers\n", num_noinputs
);
1602 if (num_nodrive
> 0) fprintf(YAG_CONTEXT
->YAGLE_STAT_FILE
, "%d signal which drive nothing\n", num_nodrive
);
1603 if (num_conf
> 0) fprintf(YAG_CONTEXT
->YAGLE_STAT_FILE
, "%d potentially conflictual signals\n", num_conf
);
1604 if (num_hz
> 0) fprintf(YAG_CONTEXT
->YAGLE_STAT_FILE
, "%d potentially tristate signals\n", num_hz
);
1605 fprintf(YAG_CONTEXT
->YAGLE_STAT_FILE
, "------------------------------------------------------------\n");
1606 fprintf(YAG_CONTEXT
->YAGLE_STAT_FILE
, "CMOS DUAL cones : %ld\n", num_cmosdual
);
1607 fprintf(YAG_CONTEXT
->YAGLE_STAT_FILE
, "Total cones : %ld\n", index
-1);
1610 /*---------------------------------------------------------------------------*
1611 | Build the behavioural figure |
1612 *----------------------------------------------------------------------------*/
1614 if ((mode
& YAG_GENBEFIG
) != 0 && YAG_CONTEXT
->YAGLE_NB_ERR
== 0) {
1615 chain_list
*modeled
= NULL
;
1616 chain_list
*unmodeled
= NULL
;
1619 yagChrono(&START
,&start
);
1620 if (!YAG_CONTEXT
->YAG_SILENT_MODE
) yagMessage(MES_BUILD_BEFIG
, NULL
);
1621 yagSortModeledInstances(ptmbkfig
, &modeled
, &unmodeled
);
1622 if (unmodeled
!= NULL
) {
1623 ptcorelofig
= yagBuildHierarchy(ptcnsfig
, ptmbkfig
, &ptrootlofig
, unmodeled
);
1624 savename
= ptrootlofig
->NAME
;
1625 if (YAG_CONTEXT
->YAG_OUTNAME
!= NULL
) ptrootlofig
->NAME
= YAG_CONTEXT
->YAG_OUTNAME
;
1626 yagGuessRootConnectorDirections(ptrootlofig
);
1627 savelofig(ptrootlofig
);
1628 ptrootlofig
->NAME
= savename
;
1629 yagBuildCoreBefig(ptcorelofig
, ptcnsfig
, modeled
);
1630 dellofig(ptcorelofig
->NAME
);
1632 else yagBuildBefig(ptcnsfig
, YAG_CONTEXT
->YAG_OUTNAME
);
1634 freechain(unmodeled
);
1635 yagChrono(&END
,&end
);
1636 if (!YAG_CONTEXT
->YAG_SILENT_MODE
) yagPrintTime(&START
,&END
,start
,end
);
1639 /*---------------------------------------------------------------------------*
1640 | Check connectors |
1641 *----------------------------------------------------------------------------*/
1643 for (ptcon
= ptcnsfig
->LOCON
; ptcon
; ptcon
= ptcon
->NEXT
) {
1644 if (ptcon
->DIRECTION
== UNKNOWN
) {
1646 yagWarning(WAR_CON_UNUSED
, NULL
, ptcon
->NAME
, NULL
, 0);
1649 if (YAG_CONTEXT
->YAG_STAT_MODE
) {
1650 if (numconunused
!= 0) fprintf(YAG_CONTEXT
->YAGLE_STAT_FILE
, "%d unused connectors\n", numconunused
);
1653 /*---------------------------------------------------------------------------*
1654 | Build the logical figure |
1655 *----------------------------------------------------------------------------*/
1657 if ((mode
& YAG_GENLOFIG
) != 0 && YAG_CONTEXT
->YAGLE_NB_ERR
== 0) {
1658 yagChrono(&START
,&start
);
1659 if (!YAG_CONTEXT
->YAG_SILENT_MODE
) yagMessage(MES_BUILD_LOFIG
, NULL
);
1660 yagBuildLofig(ptcnsfig
, ptmbkfig
);
1661 yagChrono(&END
,&end
);
1662 if (!YAG_CONTEXT
->YAG_SILENT_MODE
) yagPrintTime(&START
,&END
,start
,end
);
1665 /*---------------------------------------------------------------------------*
1667 *----------------------------------------------------------------------------*/
1669 if (YAG_CONTEXT
->YAG_GEN_SIGNATURE
&& YAG_CONTEXT
->YAGLE_NB_ERR
== 0) {
1670 for(ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
1671 if ((ptcone
->TYPE
& (CNS_LATCH
|CNS_MASTER
|CNS_SLAVE
|CNS_MEMSYM
)) != 0) continue;
1672 if ((mode
& YAG_GENLOFIG
) == 0) {
1673 yagMakeConeModel(ptcone
);
1675 ptuser
= getptype(ptcone
->USER
, YAG_MODEL_PTYPE
);
1676 if (ptuser
!= NULL
) {
1677 if (ptuser
->DATA
!= NULL
&& strlen(ptuser
->DATA
) > 0) {
1678 ptcone
->USER
= addptype(ptcone
->USER
, CNS_SIGNATURE
, ptuser
->DATA
);
1684 /*---------------------------------------------------------------------------*
1685 | Destruction of constraints |
1686 *----------------------------------------------------------------------------*/
1688 yagDeleteConstraints();
1690 #ifdef AVERTEC_LICENSE
1691 if(avt_givetoken("YAGLE_LICENSE_SERVER", YAG_CONTEXT
->YAGLE_TOOLNAME
)!=AVT_VALID_TOKEN
) EXIT(1);
1694 /*---------------------------------------------------------------------------*
1695 | Generate .loop file |
1696 *----------------------------------------------------------------------------*/
1698 if (YAG_CONTEXT
->YAG_LOOP_MODE
) {
1699 chain_list
*loops
= yagCircuitLoops(ptcnsfig
);
1701 if (loops
!= NULL
) {
1702 YAG_CONTEXT
->YAGLE_LOOP_FILE
=mbkfopen(YAG_CONTEXT
->YAG_OUTNAME
,"loop",WRITE_TEXT
);
1703 if(YAG_CONTEXT
->YAGLE_LOOP_FILE
== NULL
) {
1704 char buff
[YAGBUFSIZE
];
1705 sprintf(buff
,"%s.loop",YAG_CONTEXT
->YAG_OUTNAME
);
1706 avt_errmsg(YAG_ERRMSG
, "006", AVT_FATAL
, buff
);
1708 sprintf(buffer
,"Loop file : %s.loop\n",YAG_CONTEXT
->YAG_OUTNAME
);
1709 avt_printExecInfo( YAG_CONTEXT
->YAGLE_LOOP_FILE
, "#", buffer
, "");
1710 yagSaveCircuitLoops(loops
);
1711 fclose(YAG_CONTEXT
->YAGLE_LOOP_FILE
);
1715 /*---------------------------------------------------------------------------*
1716 | Generate .mutex file |
1717 *----------------------------------------------------------------------------*/
1719 if (V_BOOL_TAB
[__YAGLE_GUESS_MUTEX
].VALUE
) {
1720 FILE *fpmutex
= mbkfopen(YAG_CONTEXT
->YAG_OUTNAME
,"mutex",WRITE_TEXT
);
1721 chain_list
*guess_mutex
= yagGuessMutex(ptcnsfig
);
1722 chain_list
*ptmutexchain
;
1725 if (guess_mutex
!= NULL
) {
1726 fpmutex
= mbkfopen(YAG_CONTEXT
->YAG_OUTNAME
,"mutex",WRITE_TEXT
);
1727 if(fpmutex
== NULL
) {
1728 char buff
[YAGBUFSIZE
];
1729 sprintf(buff
,"%s.mutex",YAG_CONTEXT
->YAG_OUTNAME
);
1730 avt_errmsg(YAG_ERRMSG
, "006", AVT_FATAL
, buff
);
1732 sprintf(buffer
,"MUTEX Guess file : %s.mutex\n",YAG_CONTEXT
->YAG_OUTNAME
);
1733 avt_printExecInfo(fpmutex
, "#", buffer
, "");
1734 for (ptmutexchain
= guess_mutex
; ptmutexchain
; ptmutexchain
= ptmutexchain
->NEXT
) {
1736 fprintf(fpmutex
, "MUTEX Group %d:\n", count
);
1737 for (ptchain
= ptmutexchain
->DATA
; ptchain
; ptchain
= ptchain
->NEXT
) {
1738 fprintf(fpmutex
, " %s\n", (char *)ptchain
->DATA
);
1740 fprintf(fpmutex
, "\n");
1746 /*---------------------------------------------------------------------------*
1747 | Unmark latches and precharges not on given clock paths |
1748 *----------------------------------------------------------------------------*/
1750 yagDetectClockLatch(ifl
, ptcnsfig
);
1751 yagDetectNotClockLatch(ifl
, ptcnsfig
);
1752 yagDetectClockPrech(ifl
, ptcnsfig
);
1753 yagInfUnmarkLatches(ifl
, ptcnsfig
);
1754 if (YAG_CONTEXT
->YAG_CLOCK_GATE
) yagDetectClockGating(ifl
, ptcnsfig
);
1756 avt_log(LOGYAG
,0,"------------------------------------------------------------\n");
1757 if (YAG_CONTEXT
->YAGLE_NB_ERR
> 0) {
1758 avt_log(LOGYAG
,0," %ld ERROR(S) detected\n",YAG_CONTEXT
->YAGLE_NB_ERR
);
1760 avt_log(LOGYAG
,0,"See file '%s.rep' for more information\n",YAG_CONTEXT
->YAG_OUTNAME
);
1761 avt_log(LOGYAG
,0,"------------------------------------------------------------\n");
1763 /*---------------------------------------------------------------------------*
1764 | Destruction of Bdd toolbox |
1765 *----------------------------------------------------------------------------*/
1770 /*---------------------------------------------------------------------------*
1772 *----------------------------------------------------------------------------*/
1774 if (YAG_CONTEXT
->YAG_STAT_MODE
) {
1775 fclose(YAG_CONTEXT
->YAGLE_STAT_FILE
);
1777 if (close_err_file
) {
1778 fclose(YAG_CONTEXT
->YAGLE_ERR_FILE
);
1779 YAG_CONTEXT
->YAGLE_ERR_FILE
= NULL
;
1781 else fflush(YAG_CONTEXT
->YAGLE_ERR_FILE
);
1783 /*---------------------------------------------------------------------------*
1784 | Cone type cleaning, supply cone renaming and lofig restoration |
1785 *----------------------------------------------------------------------------*/
1787 for(ptcone
= ptcnsfig
->CONE
; ptcone
!= NULL
; ptcone
= ptcone
->NEXT
) {
1788 yagCleanCone(ptcone
);
1789 ptsig
= (losig_list
*)getptype(ptcone
->USER
, CNS_SIGNAL
)->DATA
;
1790 if ((ptcone
->TYPE
& (CNS_VDD
|CNS_VSS
)) != 0) {
1791 ptcone
->NAME
= ptsig
->NAMECHAIN
->DATA
;
1793 ptchain
= (chain_list
*)getptype(ptsig
->USER
, LOFIGCHAIN
)->DATA
;
1794 for (; ptchain
!= NULL
; ptchain
= ptchain
->NEXT
) {
1795 ptcon
= (locon_list
*)ptchain
->DATA
;
1796 if (ptcon
->TYPE
== 'T' && ptcon
->NAME
== CNS_GRIDNAME
) {
1797 pttrans
= (lotrs_list
*)ptcon
->ROOT
;
1798 pttrans
->GRID
= ptcon
;
1801 if (getptype(ptcone
->USER
, YAG_INFO_PTYPE
) != NULL
) {
1802 ptcone
->USER
= delptype(ptcone
->USER
, YAG_INFO_PTYPE
);
1805 for (pttrans
= ptcnsfig
->LOTRS
; pttrans
; pttrans
= pttrans
->NEXT
) {
1806 if (getptype(pttrans
->USER
, CNS_DRIVINGCONE
)->DATA
== NULL
) {
1807 pttrans
->GRID
= (locon_list
*)getptype(pttrans
->USER
, YAG_GRIDCON_PTYPE
)->DATA
;
1808 pttrans
->USER
= delptype(pttrans
->USER
, CNS_DRIVINGCONE
);
1811 for (ptcon
= ptcnsfig
->INTCON
; ptcon
; ptcon
= ptcon
->NEXT
) {
1813 if (ptcon
->SIG
->TYPE
== 'E') {
1814 ptcon
->SIG
->TYPE
= 'I';
1817 for (ptcell
= ptcnsfig
->CELL
; ptcell
!= NULL
; ptcell
= ptcell
->NEXT
) {
1818 if ((ptuser
=getptype(ptcell
->USER
, YAG_SIGLIST_PTYPE
))!=NULL
) {
1819 freechain(ptuser
->DATA
);
1820 ptcell
->USER
=delptype(ptcell
->USER
, YAG_SIGLIST_PTYPE
);
1823 list0
=inf_GetEntriesByType(ifl
, INF_SUPPRESS
, INF_ANY_VALUES
);
1824 if (YAG_CONTEXT
->YAG_TAS_TIMING
== YAG_NO_TIMING
&& list0
== NULL
&& YAG_CONTEXT
->YAG_MINIMISE_INV
== FALSE
) {
1825 yagCleanBequad(ptcnsfig
->BEFIG
);
1829 /*---------------------------------------------------------------------------*
1831 *----------------------------------------------------------------------------*/
1833 mbk_comcheck( 0, cns_signcns(ptcnsfig
), 0 );
1837 /****************************************************************************
1838 * function yagenv(); *
1839 ****************************************************************************/
1841 /**** read the environment variables ****/
1843 void yagenv(void (*initfunc
)())
1845 yag_context_list
*newcontext
;
1849 newcontext
= (yag_context_list
*)mbkalloc(sizeof(yag_context_list
));
1850 if (YAG_CONTEXT
!= NULL
) {
1851 *newcontext
= *YAG_CONTEXT
;
1852 newcontext
->NEXT
= YAG_CONTEXT
;
1853 YAG_CONTEXT
= newcontext
;
1856 newcontext
->NEXT
= NULL
;
1857 YAG_CONTEXT
= newcontext
;
1860 if (initfunc
!= NULL
) initfunc();
1862 YAG_CONTEXT
->YAG_STAT_MODE
= V_BOOL_TAB
[__YAGLE_STAT_MODE
].VALUE
;
1863 YAG_CONTEXT
->YAG_LOOP_MODE
= V_BOOL_TAB
[__YAGLE_LOOP_MODE
].VALUE
;
1864 YAG_CONTEXT
->YAG_SILENT_MODE
= V_BOOL_TAB
[__YAGLE_SILENT_MODE
].VALUE
;
1866 str
= V_STR_TAB
[__AVT_LANGUAGE
].VALUE
;
1868 if ((str
[0]=='e') || (str
[0]=='E')) {
1869 YAG_CONTEXT
->YAGLE_LANG
= 'E';
1871 else YAG_CONTEXT
->YAGLE_LANG
= 'F';
1874 YAG_CONTEXT
->YAG_MAX_LINKS
= V_INT_TAB
[__YAGLE_MAX_LINKS
].VALUE
;
1875 YAG_CONTEXT
->YAG_RELAX_LINKS
= V_INT_TAB
[__YAGLE_RELAX_LINKS
].VALUE
;
1876 YAG_CONTEXT
->YAG_BDDCEILING
= V_INT_TAB
[__YAGLE_BDDCEILING
].VALUE
;
1877 YAG_CONTEXT
->YAG_THRESHOLD
= V_FLOAT_TAB
[__YAGLE_THRESHOLD
].VALUE
;
1878 YAG_CONTEXT
->YAG_SPLITTIMING_RATIO
= V_FLOAT_TAB
[__YAGLE_SPLITTIMING_RATIO
].VALUE
;
1879 YAG_CONTEXT
->YAG_SENSITIVE_RATIO
= V_FLOAT_TAB
[__YAGLE_SENSITIVE_RATIO
].VALUE
;
1880 YAG_CONTEXT
->YAG_SENSITIVE_MAX
= V_INT_TAB
[__YAGLE_SENSITIVE_MAX
].VALUE
;
1881 YAG_CONTEXT
->YAG_RELAX_ALGO
= V_BOOL_TAB
[__YAGLE_RELAX_ALGO
].VALUE
;
1882 YAG_CONTEXT
->YAG_MINIMISE_CONES
= V_BOOL_TAB
[__YAGLE_MINIMISE_CONES
].VALUE
;
1883 YAG_CONTEXT
->YAG_ASSUME_PRECEDE
= V_BOOL_TAB
[__YAGLE_BEH_ASSUME_PRECEDE
].VALUE
;
1884 YAG_CONTEXT
->YAG_BLEEDER_PRECHARGE
= V_BOOL_TAB
[__YAGLE_BLEEDER_PRECHARGE
].VALUE
;
1885 YAG_CONTEXT
->YAG_TRISTATE_MEMORY
= V_BOOL_TAB
[__YAGLE_TRISTATE_MEMORY
].VALUE
;
1886 YAG_CONTEXT
->YAG_INTERFACE_VECTORS
= V_BOOL_TAB
[__YAGLE_INTERFACE_VECTORS
].VALUE
;
1887 YAG_CONTEXT
->YAG_SIMPLIFY_EXPR
= V_BOOL_TAB
[__YAGLE_SIMPLIFY_EXPRESSIONS
].VALUE
;
1888 YAG_CONTEXT
->YAG_SIMPLIFY_PROCESSES
= V_BOOL_TAB
[__YAGLE_SIMPLIFY_PROCESSES
].VALUE
;
1889 YAG_CONTEXT
->YAG_MINIMISE_INV
= V_BOOL_TAB
[__YAGLE_MINIMISE_INVERTORS
].VALUE
;
1890 YAG_CONTEXT
->YAG_COMPACT_BEHAVIOUR
= V_BOOL_TAB
[__YAGLE_COMPACT_BEHAVIOUR
].VALUE
;
1891 YAG_CONTEXT
->YAG_GEN_SIGNATURE
= V_BOOL_TAB
[__YAGLE_GEN_SIGNATURE
].VALUE
;
1893 str
= V_STR_TAB
[__YAGLE_DEBUG_CONE
].VALUE
;
1895 YAG_CONTEXT
->YAG_DEBUG_CONE
= namealloc(str
);
1898 YAG_CONTEXT
->YAG_BLOCK_BIDIR
= V_BOOL_TAB
[__YAGLE_BLOCK_BIDIR
].VALUE
;
1899 YAG_CONTEXT
->YAG_REMOVE_PARA
= V_BOOL_TAB
[__YAGLE_REMOVE_PARATRANS
].VALUE
;
1900 YAG_CONTEXT
->YAG_BLEEDER_STRICTNESS
= V_INT_TAB
[__YAGLE_BLEEDER_STRICTNESS
].VALUE
;
1901 YAG_CONTEXT
->YAG_DEPTH
= V_INT_TAB
[__YAGLE_DEPTH
].VALUE
;
1902 if (YAG_CONTEXT
->YAG_DEPTH
== 0) YAG_CONTEXT
->YAG_USE_FCF
= FALSE
;
1903 YAG_CONTEXT
->YAG_AUTOLOOP_DEPTH
= V_INT_TAB
[__YAGLE_AUTOLOOP_DEPTH
].VALUE
;
1904 YAG_CONTEXT
->YAG_BUS_DEPTH
= V_INT_TAB
[__YAGLE_BUS_DEPTH
].VALUE
;
1905 YAG_CONTEXT
->YAG_AUTOLOOP_CEILING
= V_INT_TAB
[__YAGLE_AUTOLOOP_CEILING
].VALUE
;
1907 YAG_CONTEXT
->YAG_ORIENT
= V_BOOL_TAB
[__YAGLE_ORIENT
].VALUE
;
1908 YAG_CONTEXT
->YAG_PROP_HZ
= V_BOOL_TAB
[__YAGLE_PROP_HZ
].VALUE
;
1910 if (V_BOOL_TAB
[__YAGLE_MAKE_CELLS
].SET
)
1911 YAG_CONTEXT
->YAG_MAKE_CELLS
= V_BOOL_TAB
[__YAGLE_MAKE_CELLS
].VALUE
;
1913 YAG_CONTEXT
->YAG_GENIUS
= V_BOOL_TAB
[__YAGLE_GENIUS
].VALUE
;
1914 YAG_CONTEXT
->YAG_ONLY_GENIUS
= V_BOOL_TAB
[__YAGLE_ONLY_GENIUS
].VALUE
;
1915 YAG_CONTEXT
->YAG_CELL_SHARE
= V_BOOL_TAB
[__YAGLE_CELL_SHARE
].VALUE
;
1916 YAG_CONTEXT
->YAG_DETECT_LATCHES
= V_BOOL_TAB
[__YAGLE_DETECT_LATCHES
].VALUE
;
1917 YAG_CONTEXT
->YAG_LOOP_ANALYSIS
= V_BOOL_TAB
[__YAGLE_LOOP_ANALYSIS
].VALUE
;
1918 YAG_CONTEXT
->YAG_AUTO_FLIPFLOP
= V_BOOL_TAB
[__YAGLE_AUTO_FLIPFLOP
].VALUE
;
1920 str
= V_STR_TAB
[__YAGLE_AUTO_ASYNC
].VALUE
;
1922 if ((str
[0]=='y') || (str
[0]=='Y')) {
1923 YAG_CONTEXT
->YAG_AUTO_ASYNC
= TRUE
;
1925 else if (!strcasecmp(str
, "remove")) {
1926 YAG_CONTEXT
->YAG_AUTO_ASYNC
= 2;
1928 else YAG_CONTEXT
->YAG_AUTO_ASYNC
= FALSE
;
1931 str
= V_STR_TAB
[__YAGLE_AUTO_RS
].VALUE
;
1934 if (!strcmp(buf
, "no")) {
1935 YAG_CONTEXT
->YAG_AUTO_RS
= 0;
1938 YAG_CONTEXT
->YAG_AUTO_RS
= 1;
1939 if (strstr(buf
, "latch") != NULL
) {
1940 YAG_CONTEXT
->YAG_AUTO_RS
|= YAG_RS_LATCH
;
1942 if (strstr(buf
, "model") != NULL
) {
1943 YAG_CONTEXT
->YAG_AUTO_RS
|= YAG_RS_MODEL
;
1945 if (strstr(buf
, "tolerant") != NULL
) {
1946 YAG_CONTEXT
->YAG_AUTO_RS
|= YAG_RS_TOLERANT
;
1948 if (strstr(buf
, "illegal") != NULL
) {
1949 YAG_CONTEXT
->YAG_AUTO_RS
|= YAG_RS_ILLEGAL
;
1951 else if (strstr(buf
, "legal") != NULL
) {
1952 YAG_CONTEXT
->YAG_AUTO_RS
|= YAG_RS_LEGAL
;
1957 str
= V_STR_TAB
[__YAGLE_AUTO_MEMSYM
].VALUE
;
1959 if ((str
[0]=='y') || (str
[0]=='Y')) {
1960 YAG_CONTEXT
->YAG_AUTO_MEMSYM
= TRUE
;
1962 else YAG_CONTEXT
->YAG_AUTO_MEMSYM
= FALSE
;
1965 YAG_CONTEXT
->YAG_BUS_ANALYSIS
= V_BOOL_TAB
[__YAGLE_BUS_ANALYSIS
].VALUE
;
1966 YAG_CONTEXT
->YAG_FCL_DETECT
= V_BOOL_TAB
[__YAGLE_FCL_DETECT
].VALUE
;
1967 YAG_CONTEXT
->YAG_ONLY_FCL
= V_BOOL_TAB
[__YAGLE_ONLY_FCL
].VALUE
;
1968 YAG_CONTEXT
->YAG_ONE_SUPPLY
= V_BOOL_TAB
[__YAGLE_ONE_SUPPLY
].VALUE
;
1969 YAG_CONTEXT
->YAG_NO_SUPPLY
= V_BOOL_TAB
[__YAGLE_NO_SUPPLY
].VALUE
;
1971 if (V_BOOL_TAB
[__YAGLE_NOTSTRICT
].SET
)
1972 YAG_CONTEXT
->YAG_NOTSTRICT
= V_BOOL_TAB
[__YAGLE_NOTSTRICT
].VALUE
;
1974 YAG_CONTEXT
->YAG_ELP
= V_BOOL_TAB
[__YAGLE_ELP
].VALUE
;
1976 str
= V_STR_TAB
[__YAGLE_TAS_TIMING
].VALUE
;
1978 if (!strcasecmp(str
, "max")) {
1979 YAG_CONTEXT
->YAG_TAS_TIMING
= YAG_MAX_TIMING
;
1981 else if (!strcasecmp(str
, "med")) {
1982 YAG_CONTEXT
->YAG_TAS_TIMING
= YAG_MED_TIMING
;
1984 else if (!strcasecmp(str
, "min")) {
1985 YAG_CONTEXT
->YAG_TAS_TIMING
= YAG_MIN_TIMING
;
1989 YAG_CONTEXT
->YAG_HELP_S
= V_BOOL_TAB
[__YAGLE_HELP_S
].VALUE
;
1991 if (V_STR_TAB
[__YAGLE_FILENAME
].SET
) {
1992 YAG_CONTEXT
->YAG_FILENAME
= namealloc(V_STR_TAB
[__YAGLE_FILENAME
].VALUE
);
1995 if (V_STR_TAB
[__YAGLE_FIGNAME
].SET
) {
1996 YAG_CONTEXT
->YAG_FIGNAME
= namealloc(V_STR_TAB
[__YAGLE_FIGNAME
].VALUE
);
1999 if (V_STR_TAB
[__YAGLE_OUTNAME
].SET
) {
2000 YAG_CONTEXT
->YAG_OUTNAME
= namealloc(V_STR_TAB
[__YAGLE_OUTNAME
].VALUE
);
2003 YAG_CONTEXT
->YAG_FILE
= V_BOOL_TAB
[__YAGLE_FILE
].VALUE
;
2004 YAG_CONTEXT
->YAG_CONE_NETLIST
= V_BOOL_TAB
[__YAGLE_CONE_NETLIST
].VALUE
;
2005 YAG_CONTEXT
->YAG_BEFIG
= V_BOOL_TAB
[__YAGLE_VBE
].VALUE
;
2006 YAG_CONTEXT
->YAG_BLACKBOX_SUPPRESS
= V_BOOL_TAB
[__YAGLE_BLACKBOX_SUPPRESS
].VALUE
;
2007 YAG_CONTEXT
->YAG_BLACKBOX_IGNORE
= V_BOOL_TAB
[__YAGLE_BLACKBOX_IGNORE
].VALUE
;
2008 YAG_CONTEXT
->YAG_NORC
= V_BOOL_TAB
[__YAGLE_NORC
].VALUE
;
2009 YAG_CONTEXT
->YAG_HIERARCHICAL_MODE
= V_BOOL_TAB
[__YAGLE_HIERARCHICAL_MODE
].VALUE
;
2010 YAG_CONTEXT
->YAG_MARK_TRISTATE_MEMORY
= V_BOOL_TAB
[__YAGLE_MARK_TRISTATE_MEMORY
].VALUE
;
2011 YAG_CONTEXT
->YAG_KEEP_REDUNDANT
= V_BOOL_TAB
[__YAGLE_KEEP_REDUNDANT
].VALUE
;
2012 YAG_CONTEXT
->YAG_KEEP_GLITCHERS
= V_INT_TAB
[__YAGLE_KEEP_GLITCHERS
].VALUE
;
2013 YAG_CONTEXT
->YAG_DETECT_PRECHARGE
= V_BOOL_TAB
[__YAGLE_DETECT_PRECHARGE
].VALUE
;
2014 YAG_CONTEXT
->YAG_STRICT_CKLATCH
= V_BOOL_TAB
[__YAGLE_STRICT_CKLATCH
].VALUE
;
2015 YAG_CONTEXT
->YAG_USESTMSOLVER
= V_BOOL_TAB
[__YAGLE_USESTMSOLVER
].VALUE
;
2016 YAG_CONTEXT
->YAG_LATCH_REQUIRE_CLOCK
= V_BOOL_TAB
[__YAGLE_LATCH_REQUIRE_CLOCK
].VALUE
;
2017 YAG_CONTEXT
->YAG_DETECT_REDUNDANT
= V_BOOL_TAB
[__YAGLE_DETECT_REDUNDANT
].VALUE
;
2019 str
= V_STR_TAB
[__YAGLE_SIMPLE_LATCH
].VALUE
;
2022 YAG_CONTEXT
->YAG_SIMPLE_LATCH
= FALSE
;
2023 YAG_CONTEXT
->YAG_DETECT_LEVELHOLD
= 0;
2024 YAG_CONTEXT
->YAG_DETECT_SIMPLE_MEMSYM
= FALSE
;
2025 if (strstr(buf
, "latch") != NULL
) {
2026 YAG_CONTEXT
->YAG_SIMPLE_LATCH
= TRUE
;
2028 if (strstr(buf
, "memsym") != NULL
) {
2029 YAG_CONTEXT
->YAG_DETECT_SIMPLE_MEMSYM
= TRUE
;
2031 if (strstr(buf
, "strictlevelhold") != NULL
) {
2032 YAG_CONTEXT
->YAG_DETECT_LEVELHOLD
= 2;
2034 else if (strstr(buf
, "levelhold") != NULL
) {
2035 YAG_CONTEXT
->YAG_DETECT_LEVELHOLD
= 1;
2039 str
= getenv("YAGLE_DETECT_SIMPLE_MEMSYM");
2041 if ((str
[0]=='y') || (str
[0]=='Y')) {
2042 YAG_CONTEXT
->YAG_DETECT_SIMPLE_MEMSYM
= TRUE
;
2044 else YAG_CONTEXT
->YAG_DETECT_SIMPLE_MEMSYM
= FALSE
;
2047 YAG_CONTEXT
->YAG_USE_CONNECTOR_DIRECTION
= V_BOOL_TAB
[__YAGLE_USE_CONNECTOR_DIRECTION
].VALUE
;
2049 str
= V_STR_TAB
[__YAGLE_CLOCK_GATE
].VALUE
;
2052 YAG_CONTEXT
->YAG_CLOCK_GATE
= 0;
2053 if (strstr(buf
, "yes") != NULL
) {
2054 YAG_CONTEXT
->YAG_CLOCK_GATE
|= (short)0x3;
2056 if (strstr(buf
, "check") != NULL
) {
2057 YAG_CONTEXT
->YAG_CLOCK_GATE
|= (short)0x1;
2059 if (strstr(buf
, "filter") != NULL
) {
2060 YAG_CONTEXT
->YAG_CLOCK_GATE
|= (short)0x2;
2064 YAG_CONTEXT
->YAG_MEMSYM_HEURISTIC
= V_BOOL_TAB
[__YAGLE_MEMSYM_HEURISTIC
].VALUE
;
2065 YAG_CONTEXT
->YAG_STUCK_LATCH
= V_BOOL_TAB
[__YAGLE_STUCK_LATCH
].VALUE
;
2066 YAG_CONTEXT
->YAG_DELAYED_RS
= V_BOOL_TAB
[__YAGLE_DELAYED_RS
].VALUE
;
2068 YAG_CONTEXT
->YAG_FLAGS
=0;
2074 yag_context_list
*oldcontext
;
2076 if (YAG_CONTEXT
== NULL
) yagBug(DBG_NO_CONTEXT
,"yagrestore",NULL
,NULL
,0);
2077 oldcontext
= YAG_CONTEXT
;
2078 YAG_CONTEXT
= YAG_CONTEXT
->NEXT
;
2079 mbkfree(oldcontext
);