1 /******************************************************************************/
3 /* Chaine de CAO & VLSI AVERTEC */
5 /* Produit : TLF Version 1.00 */
8 /* (c) copyright 2000 AVERTEC */
9 /* Tous droits reserves */
11 /* Auteur(s) : Gilles Augustins */
13 /******************************************************************************/
17 #include "tlf_parse.h"
20 /******************************************************************************/
22 /******************************************************************************/
23 static cbhcomb *ptrcbhcomb;
24 static cbhseq *ptrcbhseq;
28 typedef struct minmax {
33 static chain_list *output;
35 static long losig_index;
36 static lofig_list *ptrlofig;
37 static losig_list *ptrlosig;
38 static locon_list *ptrlocon;
42 static char namebuf[1024];
43 static chain_list *ch, *chp, *xchain, *ychain, *xydatamin, *xydatamax, *ydatamin, *ydatamax;
44 static char xtype, ytype;
45 static char dimension;
48 static timing_model *modelmin;
49 static timing_model *modelmax;
50 static timing_ttable *ttemplate;
53 static ttvfig_list *fig;
54 static int nbconsig, nbbreaksig, nblatchsig;
55 static chain_list *consigchain, *breaksigchain, *latchsigchain;
56 static ttvevent_list *root, *node;
57 static ttvline_list *line;
60 static ht *doublemodels;
61 static chain_list *clocks;
62 static int i, l, m, lsb, msb;
63 static ttvsig_list *sigroot, *signode, *sig;
64 static char *pinr, *pinn, *pname, *bname, *vectname;
65 static char *mindlymname, *maxdlymname, *minslwmname, *maxslwmname;
68 static float slwmin, slwmax, dlymin, dlymax, mincstr, maxcstr;
69 static float *caparray;
72 static timing_model *delaymodelmin, *slewmodelmin;
73 static timing_model *delaymodelmax, *slewmodelmax;
75 static chain_list *flipflops;
76 static chain_list *latchs;
78 static segment *ptseg;
79 static double thmin = 0.1, thmax = 0.9;
80 static double inputdth = 0.5, outputdth = 0.5;
81 static double voltage, temperature;
82 static int itype, otype;
83 static timing_props *properties;
86 /******************************************************************************/
87 /* function declarations */
88 /******************************************************************************/
98 struct chain *chainlist;
99 struct { struct chain *CHAIN; char TYPE; } axedef;
100 struct { struct chain *CHAIN; char DIM; } datadef;
101 struct { float MIN; float MAX; } valdef;
102 struct { char *MIN; char *MAX; } bitext;
105 struct segment *ssegment;
112 %token TLF3_TOKEN_ARROW "=>"
113 %token TLF3_TOKEN_ASYNCH
114 %token TLF3_TOKEN_BIDIR
115 %token TLF3_TOKEN_CELL
116 %token TLF3_TOKEN_CELLTYPE
117 %token TLF3_TOKEN_CLEAR
118 %token TLF3_TOKEN_CLOCK
119 %token TLF3_TOKEN_CLOCK_REG
120 %token TLF3_TOKEN_CLOCK_SLEW_AXIS
121 %token TLF3_TOKEN_COMB
122 %token TLF3_TOKEN_CONST
123 %token TLF3_TOKEN_CONTROL
124 %token TLF3_TOKEN_DATA
125 %token TLF3_TOKEN_DATE
126 %token TLF3_TOKEN_DELAY
127 %token <real> TLF3_TOKEN_ENABLE
128 %token <real> TLF3_TOKEN_ENUMBER
129 %token TLF3_TOKEN_ENVIRONMENT
130 %token <text> TLF3_TOKEN_EXPR
131 %token TLF3_TOKEN_FAST
132 %token TLF3_TOKEN_FOR_BITS
133 %token TLF3_TOKEN_FUNCTION
134 %token TLF3_TOKEN_GROUND
135 %token TLF3_TOKEN_HEADER
136 %token TLF3_TOKEN_HIGH
137 %token TLF3_TOKEN_HOLD
138 %token <text> TLF3_TOKEN_IDENT
139 %token TLF3_TOKEN_IGNORE
140 %token TLF3_TOKEN_INCELL
141 %token TLF3_TOKEN_INPUT
142 %token TLF3_TOKEN_INPUT_REG
143 %token TLF3_TOKEN_INPUT_SLEW_AXIS
144 %token TLF3_TOKEN_INVERTED_OUTPUT
145 %token TLF3_TOKEN_LATCH
146 %token TLF3_TOKEN_LIBRARY
147 %token TLF3_TOKEN_LOAD_AXIS
148 %token TLF3_TOKEN_AXIS
149 %token TLF3_TOKEN_LOW
150 %token TLF3_TOKEN_MODEL
151 %token TLF3_TOKEN_NEGEDGE
152 %token <real> TLF3_TOKEN_NUMBER
153 %token TLF3_TOKEN_OPE
154 %token TLF3_TOKEN_OUTCELL
155 %token TLF3_TOKEN_OUTPUT
156 %token TLF3_TOKEN_PATH
157 %token TLF3_TOKEN_PIN
158 %token TLF3_TOKEN_PINDIR
159 %token TLF3_TOKEN_PINTYPE
160 %token TLF3_TOKEN_PIN_CAP
161 %token TLF3_TOKEN_POSEDGE
162 %token <text> TLF3_TOKEN_QSTRING
163 %token TLF3_TOKEN_REGISTER
164 %token TLF3_TOKEN_SEQ
165 %token TLF3_TOKEN_SET
166 %token TLF3_TOKEN_SETUP
167 %token TLF3_TOKEN_SLAVE_CLOCK
168 %token TLF3_TOKEN_SLEW
169 %token TLF3_TOKEN_SLOW
170 %token TLF3_TOKEN_SLEW_AXIS
171 %token TLF3_TOKEN_SPLINE
172 %token TLF3_TOKEN_TECHNOLOGY
173 %token TLF3_TOKEN_TIMING_PROPS
174 %token TLF3_TOKEN_TLF_VERSION
175 %token TLF3_TOKEN_TRISTATE
176 %token TLF3_TOKEN_TRANSITION_START
177 %token TLF3_TOKEN_TRANSITION_END
178 %token TLF3_TOKEN_INPUT_THRESHOLD
179 %token TLF3_TOKEN_OUTPUT_THRESHOLD
180 %token <text> TLF3_TOKEN_VECT
181 %token <text> TLF3_TOKEN_VECT_IDENT
182 %token TLF3_TOKEN_VENDOR
183 %token TLF3_TOKEN_VERSION
186 %token TLF3_TOKEN_LINEAR
187 %token TLF3_TOKEN_VALUE
188 %token TLF3_TOKEN_NET_CAP
189 %token TLF3_TOKEN_NET_RES
190 %token TLF3_TOKEN_TEMPERATURE
191 %token TLF3_TOKEN_VOLTAGE
195 %type <chainlist> array1D
196 %type <chainlist> array2D
197 %type <chainlist> array1D_list
199 %type <cchar> axetype
200 %type <text> cellname
201 %type <cchar> celltype
202 %type <cchar> clocktrans
203 %type <valdef> constant
204 %type <valdef> constdelay
205 %type <valdef> constslew
206 %type <bitext> constraint
208 %type <chainlist> cval_list
209 %type <chainlist> segment_list
213 %type <chainlist> ident_list
214 %type <datadef> modeldata
215 %type <text> modelname
216 %type <chainlist> reg_list
217 %type <chainlist> outputs
221 %type <cchar> pintype
223 %type <text> templatename
224 %type <cchar> transition
225 %type <chainlist> val_list
227 %type <ssegment> segment
231 tlf_file : header genmod_list gentprops cell_list
233 if(TLF_TRACE_MODE == 'Y')
234 fprintf (stdout, " <--- done\n");
236 fprintf(stdout,"DONE!\n");*/
245 /*genmod : TLF3_TOKEN_MODEL '(' ')'
251 netmodel : TLF3_TOKEN_MODEL '(' modelname '(' modelbody ')' ')'
254 for (nx = 0, ch = xchain; ch; ch = ch->NEXT) nx++;
255 if (xydatamax && !xydatamin) {
256 sprintf (namebuf, "%s", $3);
257 modelmax = stm_addtblmodel (cname, namebuf, nx, 0, xtype, STM_NOTYPE);
258 stm_storemodel (cname, namebuf, modelmax, 0);
260 if ((xtype == STM_LOAD) || (xtype == STM_NOTYPE)) {
261 stm_modtbl_setXrange (modelmax->UMODEL.TABLE, xchain, 1);
265 if (nx > 0 && ny > 0)
266 avt_errmsg (STM_ERRMSG, "000", AVT_ERROR, $3);
268 stm_modtbl_set1Dset (modelmax->UMODEL.TABLE, xydatamax, 1);
269 for (ch = xydatamax; ch; ch = ch->NEXT)
272 freechain (xydatamax);
276 if (nx > 0 && ny > 0)
277 avt_errmsg (STM_ERRMSG, "000", AVT_ERROR, $3);
279 stm_modtbl_setconst (modelmax->UMODEL.TABLE, *(float*)xydatamax->DATA);
280 for (ch = xydatamax; ch; ch = ch->NEXT)
283 freechain (xydatamax);
288 for (ch = xchain; ch; ch = ch->NEXT){
295 | TLF3_TOKEN_MODEL '(' modelname '(' TLF3_TOKEN_LINEAR TLF3_TOKEN_VALUE '(' segment_list ')' ')' ')'
297 modelmax = stm_addmodel(cname, $3);
298 modelmax->UTYPE = STM_MOD_MODTBL;
299 modelmax->UMODEL.TABLE = stm_prop_seg2tbl ($8, STM_LOAD);
300 stm_storemodel (cname, $3, modelmax, 0);
304 gentprops : TLF3_TOKEN_TIMING_PROPS '(' prop_list ')'
316 if(inputdth != outputdth)
317 fprintf (stderr, "***tlf warning: input and output thresholds are not the same***\n");
319 | TLF3_TOKEN_TEMPERATURE '(' val ')'
323 | TLF3_TOKEN_VOLTAGE '(' val ')'
327 | TLF3_TOKEN_NET_CAP '(' ident ')'
329 modelmax = stm_getmodel(cname, $3);
330 if (TLF_CAPA_UNIT == TLF_PF)
331 for(i = 0; i < modelmax->UMODEL.TABLE->NX; i++)
332 modelmax->UMODEL.TABLE->SET1D[i] = modelmax->UMODEL.TABLE->SET1D[i] * 1000.0;
333 stm_addcapmodel(properties, modelmax);
335 | TLF3_TOKEN_NET_RES '(' ident ')'
337 stm_addresmodel(properties, stm_getmodel(cname, $3));
341 delay_th : TLF3_TOKEN_INPUT_THRESHOLD '(' val ')'
345 | TLF3_TOKEN_OUTPUT_THRESHOLD '(' val ')'
351 threshold : TLF3_TOKEN_TRANSITION_START '(' val ')'
355 | TLF3_TOKEN_TRANSITION_END '(' val ')'
361 header : TLF3_TOKEN_HEADER '(' helem_list ')'
363 /* if(TLF_TRACE_MODE != 'Y') {
364 fprintf(stdout,"\nLOADING LIBRARY %s TLF3... ", LIBRARY_TLF_NAME);
393 library : TLF3_TOKEN_LIBRARY '(' TLF3_TOKEN_QSTRING ')'
399 breaksigchain = NULL;
400 latchsigchain = NULL;
404 LIBRARY_TLF_NAME = tlf_treatname($3);
405 stm_addcell (LIBRARY_TLF_NAME);
406 cname = LIBRARY_TLF_NAME;
408 properties = stm_prop_create (NULL, NULL);
410 properties = STM_PROPERTIES;
415 technology : TLF3_TOKEN_TECHNOLOGY '(' TLF3_TOKEN_QSTRING ')'
421 date : TLF3_TOKEN_DATE '(' TLF3_TOKEN_QSTRING ')'
427 vendor : TLF3_TOKEN_VENDOR '(' TLF3_TOKEN_QSTRING ')'
433 environment : TLF3_TOKEN_ENVIRONMENT '(' TLF3_TOKEN_QSTRING ')'
439 version : TLF3_TOKEN_VERSION '(' TLF3_TOKEN_QSTRING ')'
445 tlf_version : TLF3_TOKEN_TLF_VERSION '(' TLF3_TOKEN_QSTRING ')'
455 cell : TLF3_TOKEN_CELL '(' celldef celltprops definitions arcs ')'
461 if((ptrcbhseq != NULL) && (!mout)) {
462 if(ptrcbhseq->PIN != NULL) {
463 p = getlocon(ptrlofig, ptrcbhseq->PIN);
464 c = cbh_getcombfromlocon(p);
466 str = eqt_ConvertStr(ptrcbhseq->NAME);
467 c->FUNCTION = eqt_StrToAbl(tlfEqtCtx,str);
470 if((ptrcbhseq->DATA != NULL) && (tlf_lookingForExpr(ptrcbhseq->DATA, ptrcbhseq->PIN) == 1))
471 ptrcbhseq->DATA = tlf_replaceInAbl(ptrcbhseq->DATA, ptrcbhseq->PIN, ptrcbhseq->NAME);
474 if(ptrcbhseq->NEGPIN != NULL) {
475 p = getlocon(ptrlofig, ptrcbhseq->NEGPIN);
476 c = cbh_getcombfromlocon(p);
478 str = eqt_ConvertStr(ptrcbhseq->NEGNAME);
479 c->FUNCTION = eqt_StrToAbl(tlfEqtCtx,str);
482 if((ptrcbhseq->DATA != NULL) && (tlf_lookingForExpr(ptrcbhseq->DATA, ptrcbhseq->NEGPIN) == 1))
483 ptrcbhseq->DATA = tlf_replaceInAbl(ptrcbhseq->DATA, ptrcbhseq->NEGPIN, ptrcbhseq->NEGNAME);
486 cbh_addseqtolofig(ptrlofig, ptrcbhseq);
494 cbh_classlofig(ptrlofig);
497 for (i = 0; i < fig->NBCONSIG; i++) {
498 sig = fig->CONSIG[i];
499 if ((sig->TYPE & TTV_SIG_B) == TTV_SIG_B) {
500 breaksigchain = addchain(breaksigchain,sig);
503 if ((sig->TYPE & TTV_SIG_L) == TTV_SIG_L) {
504 latchsigchain = addchain(latchsigchain,sig);
509 fig->NBEBREAKSIG = nbbreaksig;
510 fig->EBREAKSIG = ttv_allocreflist (breaksigchain, nbbreaksig);
511 fig->NBELATCHSIG = nblatchsig;
512 fig->ELATCHSIG = ttv_allocreflist (latchsigchain, nblatchsig);
514 for (i = 0; i < fig->NBCONSIG; i++) {
515 capa = gethtitem (pincapht, namealloc (fig->CONSIG[i]->NAME));
517 mbkfree((float*)capa);
523 delht (doublemodels);
525 freechain (flipflops);
531 latchsigchain = NULL;
533 breaksigchain = NULL;
534 fig->STATUS |= TTV_STS_DTX;
535 fig->STATUS |= TTV_STS_TTX;
539 definitions : def_list
541 fig->CONSIG = ttv_allocreflist (consigchain, nbconsig);
542 fig->NBCONSIG = nbconsig;
543 for (i = 0; i < fig->NBCONSIG; i++)
544 addhtitem (pinht, namealloc (fig->CONSIG[i]->NAME), (long)fig->CONSIG[i]);
559 reg : TLF3_TOKEN_REGISTER '('
561 if(ptrcbhseq != NULL) {
562 mout = tlf_multout(&ptrlofig,&ptrcbhcomb,&ptrcbhseq,cname);
565 ptrcbhseq = cbh_newseq();
566 ptrcbhseq->SEQTYPE = CBH_FLIPFLOP;
567 ptrcbhseq->RSCONF = NULL;
568 ptrcbhseq->RSCONFNEG = NULL;
573 if(ptrcbhseq != NULL)
574 flipflops = append (flipflops, output);
577 | TLF3_TOKEN_LATCH '('
579 if(ptrcbhseq != NULL) {
580 mout = tlf_multout(&ptrlofig,&ptrcbhcomb,&ptrcbhseq,cname);
584 ptrcbhseq = cbh_newseq();
585 ptrcbhseq->SEQTYPE = CBH_LATCH;
586 ptrcbhseq->RSCONF = NULL;
587 ptrcbhseq->RSCONFNEG = NULL;
592 if(ptrcbhseq != NULL)
593 latchs = append (latchs, output);
600 | reg_list reg_elem {}
603 reg_elem : TLF3_TOKEN_CLEAR TLF3_TOKEN_EXPR
606 str = eqt_ConvertStr($2);
607 ptrcbhseq->RESET = eqt_StrToAbl(tlfEqtCtx,str);
610 | TLF3_TOKEN_CLOCK_REG TLF3_TOKEN_EXPR
613 str = eqt_ConvertStr($2);
614 ptrcbhseq->CLOCK = eqt_StrToAbl(tlfEqtCtx,str);
617 | TLF3_TOKEN_SLAVE_CLOCK TLF3_TOKEN_EXPR
620 str = eqt_ConvertStr($2);
621 ptrcbhseq->SLAVECLOCK = eqt_StrToAbl(tlfEqtCtx,str);
624 | TLF3_TOKEN_SET TLF3_TOKEN_EXPR
627 str = eqt_ConvertStr($2);
628 ptrcbhseq->SET = eqt_StrToAbl(tlfEqtCtx,str);
631 | TLF3_TOKEN_INPUT_REG TLF3_TOKEN_EXPR
634 str = eqt_ConvertStr($2);
635 ptrcbhseq->DATA = eqt_StrToAbl(tlfEqtCtx,str);
640 outputs : TLF3_TOKEN_OUTPUT '(' ident_list ')'
642 char pin[1024], name[1024];
645 mout = tlf_multout(&ptrlofig,&ptrcbhcomb,&ptrcbhseq,cname);
647 if(ptrcbhseq != NULL){
648 strcpy(pin,tlf_chainlistToStr($3));
649 sprintf(name,"I%s",pin);
650 ptrcbhseq->PIN = namealloc(pin);
651 ptrcbhseq->NAME = namealloc(name);
657 output = append(output,$3);
659 | TLF3_TOKEN_INVERTED_OUTPUT '(' ident_list ')'
661 char negpin[1024], negname[1024];
664 mout = tlf_multout(&ptrlofig,&ptrcbhcomb,&ptrcbhseq,cname);
666 if(ptrcbhseq != NULL) {
667 strcpy(negpin,tlf_chainlistToStr($3));
668 sprintf(negname,"I%s",negpin);
669 ptrcbhseq->NEGPIN = namealloc(negpin);
670 ptrcbhseq->NEGNAME = namealloc(negname);
676 output = append(output,$3);
682 $$ = addchain (NULL, $1);
686 $$ = addchain ($2, $1);
690 celldef : cellname celltype
696 if(TLF_TRACE_MODE == 'Y')
697 fprintf (stdout, " ---> processing cell %s\n", cname);
699 /* nouvelle cellule --> lofig a creer */
701 if((p=getloadedlofig(cname)) == NULL) {
702 ptrlofig = addlofig(cname);
703 ptrlofig->MODE = 'P';
704 addcatalog(ptrlofig->NAME);
710 version = (char*) mbkalloc (TLF_BUFSIZE * sizeof (char));
711 sprintf (version, "%.2f", elpTechnoVersion);
713 fig = ttv_givehead ($1, $1, NULL);
715 ttv_setttvlevel (fig);
716 TLF_TTVFIG_LIST = addchain (TLF_TTVFIG_LIST, fig);
717 fig->INFO->TOOLNAME = TLF_TOOLNAME;
718 fig->INFO->TOOLVERSION = TLF_TOOLVERSION;
719 fig->INFO->TECHNONAME = elpTechnoName;
720 fig->INFO->TECHNOVERSION = version;
721 fig->INFO->SLOPE = STM_DEF_SLEW;
722 fig->INFO->CAPAOUT = STM_DEF_LOAD;
723 fig->INFO->STHHIGH = thmax;
724 fig->INFO->STHLOW = thmin;
725 fig->INFO->DTH = outputdth;
726 fig->INFO->TEMP = temperature;
727 fig->INFO->VDD = voltage;
728 ttv_setttvdate (fig, TTV_DATE_LOCAL);
730 pincapht = addht (100);
731 doublemodels = addht (100);
735 celltype : TLF3_TOKEN_CELLTYPE '(' TLF3_TOKEN_IGNORE ')'
739 | TLF3_TOKEN_CELLTYPE '(' TLF3_TOKEN_OUTCELL ')'
743 | TLF3_TOKEN_CELLTYPE '(' TLF3_TOKEN_INCELL ')'
747 | TLF3_TOKEN_CELLTYPE '(' TLF3_TOKEN_INCELL TLF3_TOKEN_OUTCELL ')'
751 | TLF3_TOKEN_CELLTYPE '(' TLF3_TOKEN_SEQ ')'
755 | TLF3_TOKEN_CELLTYPE '(' TLF3_TOKEN_COMB ')'
762 | TLF3_TOKEN_TIMING_PROPS '(' ')'
768 for (i = 0; i < fig->NBCONSIG; i++) {
769 sig = fig->CONSIG[i];
771 /* typer B, LL (latch), LF (flip-flop) */
773 for (line = sig->NODE[0].INLINE; line; line = line->NEXT) {
775 if ((line->TYPE & TTV_LINE_A) == TTV_LINE_A) {
776 switch (getoutputtype (sig->NAME, flipflops, latchs)) {
778 sig->TYPE |= TTV_SIG_B;
781 sig->TYPE |= TTV_SIG_LL;
784 sig->TYPE |= TTV_SIG_LF;
790 if (((line->TYPE & TTV_LINE_O) == TTV_LINE_O) || ((line->TYPE & TTV_LINE_U) == TTV_LINE_U)) {
791 sig->TYPE |= TTV_SIG_B;
792 line->NODE->ROOT->TYPE |= TTV_SIG_B;
795 for (line = sig->NODE[1].INLINE; line; line = line->NEXT) {
797 if ((line->TYPE & TTV_LINE_A) == TTV_LINE_A) {
798 switch (getoutputtype (sig->NAME, flipflops, latchs)) {
800 sig->TYPE |= TTV_SIG_B;
803 sig->TYPE |= TTV_SIG_LL;
806 sig->TYPE |= TTV_SIG_LF;
812 if (((line->TYPE & TTV_LINE_O) == TTV_LINE_O) || ((line->TYPE & TTV_LINE_U) == TTV_LINE_U)) {
813 sig->TYPE |= TTV_SIG_B;
814 line->NODE->ROOT->TYPE |= TTV_SIG_B;
821 model : TLF3_TOKEN_MODEL '(' modelname templatename '(' modelbody ')' ')'
823 if (!xydatamin && !xydatamax) {
824 for (nx = 0, ch = xchain; ch; ch = ch->NEXT) nx++;
825 for (ny = 0, ch = ychain; ch; ch = ch->NEXT) ny++;
826 ttemplate = stm_modtbl_addtemplate ($3, nx, ny, xtype, ytype);
827 if (xtype == STM_INPUT_SLEW || xtype == STM_CLOCK_SLEW) {
828 if (TLF_TIME_UNIT == TLF_NS)
829 stm_modtbl_settemplateXrange (ttemplate, xchain, 1e3);
830 if (TLF_TIME_UNIT == TLF_PS)
831 stm_modtbl_settemplateXrange (ttemplate, xchain, 1);
833 if (xtype == STM_LOAD) {
834 if (TLF_CAPA_UNIT == TLF_PF)
835 stm_modtbl_settemplateXrange (ttemplate, xchain, 1e3);
836 if (TLF_CAPA_UNIT == TLF_FF)
837 stm_modtbl_settemplateXrange (ttemplate, xchain, 1);
839 if (ytype == STM_INPUT_SLEW || ytype == STM_CLOCK_SLEW) {
840 if (TLF_TIME_UNIT == TLF_NS)
841 stm_modtbl_settemplateYrange (ttemplate, ychain, 1e3);
842 if (TLF_TIME_UNIT == TLF_PS)
843 stm_modtbl_settemplateYrange (ttemplate, ychain, 1);
845 if (ytype == STM_LOAD) {
846 if (TLF_CAPA_UNIT == TLF_PF)
847 stm_modtbl_settemplateYrange (ttemplate, ychain, 1e3);
848 if (TLF_CAPA_UNIT == TLF_FF)
849 stm_modtbl_settemplateYrange (ttemplate, ychain, 1);
855 ttemplate = stm_modtbl_gettemplate ($4);
857 sprintf (namebuf, "%s_min", $3);
858 modelmin = stm_addmodel (cname, namebuf);
859 modelmin->UMODEL.TABLE = stm_modtbl_create_ftemplate (ttemplate);
860 modelmin->UTYPE = STM_MOD_MODTBL;
861 stm_storemodel (cname, namebuf, modelmin, 0);
862 addhtitem (doublemodels, namealloc ($3), 1);
864 if (xydatamax && xydatamin) {
865 sprintf (namebuf, "%s_max", $3);
866 modelmax = stm_addmodel (cname, namebuf);
867 modelmax->UMODEL.TABLE = stm_modtbl_create_ftemplate (ttemplate);
868 modelmax->UTYPE = STM_MOD_MODTBL;
869 stm_storemodel (cname, namebuf, modelmax, 0);
871 if (xydatamax && !xydatamin) {
872 sprintf (namebuf, "%s", $3);
873 modelmax = stm_addmodel (cname, namebuf);
874 modelmax->UMODEL.TABLE = stm_modtbl_create_ftemplate (ttemplate);
875 modelmax->UTYPE = STM_MOD_MODTBL;
876 stm_storemodel (cname, namebuf, modelmax, 0);
879 for (nx = 0, ch = xchain; ch; ch = ch->NEXT) nx++;
880 for (ny = 0, ch = ychain; ch; ch = ch->NEXT) ny++;
882 addhtitem (doublemodels, namealloc ($3), 1);
883 sprintf (namebuf, "%s_min", $3);
884 modelmin = stm_addtblmodel (cname, namebuf, nx, ny, xtype, ytype);
886 if (xydatamax && xydatamin) {
887 sprintf (namebuf, "%s_max", $3);
888 modelmax = stm_addtblmodel (cname, namebuf, nx, ny, xtype, ytype);
890 if (xydatamax && !xydatamin) {
891 sprintf (namebuf, "%s", $3);
892 modelmax = stm_addtblmodel (cname, namebuf, nx, ny, xtype, ytype);
896 if (xtype == STM_INPUT_SLEW || xtype == STM_CLOCK_SLEW) {
897 if (TLF_TIME_UNIT == TLF_NS) {
899 stm_modtbl_setXrange (modelmin->UMODEL.TABLE, xchain, 1e3);
900 stm_modtbl_setXrange (modelmax->UMODEL.TABLE, xchain, 1e3);
902 if (TLF_TIME_UNIT == TLF_PS) {
904 stm_modtbl_setXrange (modelmin->UMODEL.TABLE, xchain, 1);
905 stm_modtbl_setXrange (modelmax->UMODEL.TABLE, xchain, 1);
908 if (xtype == STM_LOAD) {
909 if (TLF_CAPA_UNIT == TLF_PF) {
911 stm_modtbl_setXrange (modelmin->UMODEL.TABLE, xchain, 1e3);
912 stm_modtbl_setXrange (modelmax->UMODEL.TABLE, xchain, 1e3);
914 if (TLF_CAPA_UNIT == TLF_FF) {
916 stm_modtbl_setXrange (modelmin->UMODEL.TABLE, xchain, 1);
917 stm_modtbl_setXrange (modelmax->UMODEL.TABLE, xchain, 1);
920 if (ytype == STM_INPUT_SLEW || ytype == STM_CLOCK_SLEW) {
921 if (TLF_TIME_UNIT == TLF_NS) {
923 stm_modtbl_setYrange (modelmin->UMODEL.TABLE, ychain, 1e3);
924 stm_modtbl_setYrange (modelmax->UMODEL.TABLE, ychain, 1e3);
926 if (TLF_TIME_UNIT == TLF_PS) {
928 stm_modtbl_setYrange (modelmin->UMODEL.TABLE, ychain, 1);
929 stm_modtbl_setYrange (modelmax->UMODEL.TABLE, ychain, 1);
932 if (ytype == STM_LOAD) {
933 if (TLF_CAPA_UNIT == TLF_PF) {
935 stm_modtbl_setYrange (modelmin->UMODEL.TABLE, ychain, 1e3);
936 stm_modtbl_setYrange (modelmax->UMODEL.TABLE, ychain, 1e3);
938 if (TLF_CAPA_UNIT == TLF_FF) {
940 stm_modtbl_setYrange (modelmin->UMODEL.TABLE, ychain, 1);
941 stm_modtbl_setYrange (modelmax->UMODEL.TABLE, ychain, 1);
946 if (nx > 0 || ny > 0)
947 avt_errmsg (STM_ERRMSG, "000", AVT_ERROR, $3);
949 if (TLF_TIME_UNIT == TLF_NS) {
951 stm_modtbl_setconst (modelmin->UMODEL.TABLE, *(float*)xydatamin->DATA * 1e3);
953 stm_modtbl_setconst (modelmax->UMODEL.TABLE, *(float*)xydatamax->DATA * 1e3);
955 if (TLF_TIME_UNIT == TLF_PS) {
957 stm_modtbl_setconst (modelmin->UMODEL.TABLE, *(float*)xydatamin->DATA);
959 stm_modtbl_setconst (modelmax->UMODEL.TABLE, *(float*)xydatamax->DATA);
962 mbkfree(xydatamin->DATA);
963 freechain (xydatamin);
966 mbkfree(xydatamax->DATA);
967 freechain (xydatamax);
972 if (nx > 0 && ny > 0)
973 avt_errmsg (STM_ERRMSG, "000", AVT_ERROR, $3);
975 if (TLF_TIME_UNIT == TLF_NS) {
977 stm_modtbl_set1Dset (modelmin->UMODEL.TABLE, xydatamin, 1e3);
978 stm_modtbl_set1Dset (modelmax->UMODEL.TABLE, xydatamax, 1e3);
980 if (TLF_TIME_UNIT == TLF_PS) {
982 stm_modtbl_set1Dset (modelmin->UMODEL.TABLE, xydatamin, 1);
983 stm_modtbl_set1Dset (modelmax->UMODEL.TABLE, xydatamax, 1);
986 for (ch = xydatamin; ch; ch = ch->NEXT)
989 freechain (xydatamin);
991 for (ch = xydatamax; ch; ch = ch->NEXT)
994 freechain (xydatamax);
998 if (nx == 0 || ny == 0)
999 avt_errmsg (STM_ERRMSG, "000", AVT_ERROR, $3);
1001 if (TLF_TIME_UNIT == TLF_NS) {
1003 stm_modtbl_set2Dset (modelmin->UMODEL.TABLE, xydatamin, 1e3);
1004 stm_modtbl_set2Dset (modelmax->UMODEL.TABLE, xydatamax, 1e3);
1006 if (TLF_TIME_UNIT == TLF_PS) {
1008 stm_modtbl_set2Dset (modelmin->UMODEL.TABLE, xydatamin, 1);
1009 stm_modtbl_set2Dset (modelmax->UMODEL.TABLE, xydatamax, 1);
1011 for (ch = xydatamin; ch; ch = ch->NEXT) {
1012 for (chp = (chain_list*)ch->DATA; chp; chp = chp->NEXT)
1014 freechain (ch->DATA);
1017 freechain (xydatamin);
1018 for (ch = xydatamax; ch; ch = ch->NEXT) {
1019 for (chp = (chain_list*)ch->DATA; chp; chp = chp->NEXT)
1021 freechain (ch->DATA);
1024 freechain (xydatamax);
1029 for (ch = xchain; ch; ch = ch->NEXT)
1032 for (ch = ychain; ch; ch = ch->NEXT)
1038 modelbody : modeltype axe axe data
1045 for (ch = $4.CHAIN; ch; ch = ch->NEXT) {
1047 for (chp = (chain_list*)ch->DATA; chp; chp = chp->NEXT) {
1048 ptfl = (float*)mbkalloc (sizeof (float));
1049 *ptfl = ((minmax*)chp->DATA)->MAX;
1050 ydatamax = addchain (ydatamax, ptfl);
1052 ydatamax = reverse (ydatamax);
1053 xydatamax = addchain (xydatamax, ydatamax);
1055 xydatamax = reverse (xydatamax);
1058 if (((minmax*)(((chain_list*)($4.CHAIN->DATA))->DATA))->MIN != STM_NOVALUE) {
1059 for (ch = $4.CHAIN; ch; ch = ch->NEXT) {
1061 for (chp = (chain_list*)ch->DATA; chp; chp = chp->NEXT) {
1062 ptfl = (float*)mbkalloc (sizeof (float));
1063 *ptfl = ((minmax*)chp->DATA)->MIN;
1064 ydatamin = addchain (ydatamin, ptfl);
1066 ydatamin = reverse (ydatamin);
1067 xydatamin = addchain (xydatamin, ydatamin);
1069 xydatamin = reverse (xydatamin);
1071 for (ch = $4.CHAIN; ch; ch = ch->NEXT) {
1072 for (chp = (chain_list*)ch->DATA; chp; chp = chp->NEXT)
1073 mbkfree ((minmax*)chp->DATA);
1074 freechain ((chain_list*)ch->DATA);
1079 | modeltype axe data
1086 for (ch = $3.CHAIN; ch; ch = ch->NEXT) {
1087 ptfl = (float*)mbkalloc (sizeof (float));
1088 *ptfl = ((minmax*)ch->DATA)->MAX;
1089 xydatamax = addchain (xydatamax, ptfl);
1091 xydatamax = reverse (xydatamax);
1093 if (((minmax*)$3.CHAIN->DATA)->MIN != STM_NOVALUE) {
1094 for (ch = $3.CHAIN; ch; ch = ch->NEXT) {
1095 ptfl = (float*)mbkalloc (sizeof (float));
1096 *ptfl = ((minmax*)ch->DATA)->MIN;
1097 xydatamin = addchain (xydatamin, ptfl);
1099 xydatamin = reverse (xydatamin);
1101 for (ch = $3.CHAIN; ch; ch = ch->NEXT) {
1102 mbkfree ((minmax*)ch->DATA);
1113 for (ch = $2.CHAIN; ch; ch = ch->NEXT) {
1114 ptfl = (float*)mbkalloc (sizeof (float));
1115 *ptfl = ((minmax*)ch->DATA)->MAX;
1116 xydatamax = addchain (xydatamax, ptfl);
1118 xydatamax = reverse (xydatamax);
1120 if (((minmax*)$2.CHAIN->DATA)->MIN != STM_NOVALUE) {
1121 for (ch = $2.CHAIN; ch; ch = ch->NEXT) {
1122 ptfl = (float*)mbkalloc (sizeof (float));
1123 *ptfl = ((minmax*)ch->DATA)->MIN;
1124 xydatamin = addchain (xydatamin, ptfl);
1126 xydatamin = reverse (xydatamin);
1128 for (ch = $2.CHAIN; ch; ch = ch->NEXT) {
1129 mbkfree ((minmax*)ch->DATA);
1135 segment_list : empty
1139 | segment segment_list
1142 $$ = addchain ($2, ptseg);
1146 segment : val ':' val ':' val ':' val
1148 ptseg = (segment*)mbkalloc (sizeof (struct segment));
1157 modeltype : TLF3_TOKEN_SPLINE
1161 axe : '(' axetype val val val_list ')'
1163 ptfl = (float*)mbkalloc (sizeof (float));
1165 $$.CHAIN = addchain ($5, ptfl);
1166 ptfl = (float*)mbkalloc (sizeof (float));
1168 $$.CHAIN = addchain ($$.CHAIN, ptfl);
1173 axetype : TLF3_TOKEN_INPUT_SLEW_AXIS
1175 $$ = STM_INPUT_SLEW;
1177 | TLF3_TOKEN_CLOCK_SLEW_AXIS
1179 $$ = STM_CLOCK_SLEW;
1181 | TLF3_TOKEN_SLEW_AXIS
1183 $$ = STM_INPUT_SLEW;
1185 | TLF3_TOKEN_LOAD_AXIS
1201 ptmm = (minmax*)mbkalloc (sizeof (struct minmax));
1204 $$ = addchain ($2, ptmm);
1214 ptfl = (float*)mbkalloc (sizeof (float));
1216 $$ = addchain ($2, ptfl);
1220 data : TLF3_TOKEN_DATA '(' modeldata ')'
1228 | TLF3_TOKEN_DATA modeldata
1240 ptmm = (minmax*)mbkalloc (sizeof (struct minmax));
1243 $$.CHAIN = addchain (NULL, ptmm);
1258 array2D : array1D array1D array1D_list
1260 $$ = addchain ($3, $2);
1261 $$ = addchain ($$, $1);
1265 array1D : '(' cval cval cval_list ')'
1267 ptmm = (minmax*)mbkalloc (sizeof (struct minmax));
1270 $$ = addchain ($4, ptmm);
1271 ptmm = (minmax*)mbkalloc (sizeof (struct minmax));
1274 $$ = addchain ($$, ptmm);
1278 array1D_list : empty
1282 | array1D array1D_list
1284 $$ = addchain ($2, $1);
1288 pin : TLF3_TOKEN_PIN '(' pinname
1292 pintype pindir pinfunc pinenable pntprop_list ')'
1302 ptfl = (float*)mbkalloc (sizeof (float));
1304 addhtitem (pincapht, pname, (long)ptfl);
1324 consigchain = ttv_addrefsig (fig, pname, pname, *ptfl , dir, consigchain);
1327 clocks = addchain (clocks, pname);
1328 pincapa = TLF_NO_CAPA;
1331 /* nouveau connecteur --> LOCON et LOSIG a creer */
1333 for(c=ptrlofig->LOCON; ((c != NULL) && (strcasecmp(c->NAME,pname) != 0)); c=c->NEXT);
1334 if(c == NULL) { /* connecteur inexistant, on ajoute signal et connecteur */
1335 for(s=ptrlofig->LOSIG; (s != NULL); s=s->NEXT) {/* recherche du 1er index de libre */
1339 losig_index = i + 1;
1340 ptrlosig = addlosig(ptrlofig, losig_index, addchain(NULL, pname), 'E');
1341 ptrlocon = addlocon(ptrlofig, ttv_devect(pname), ptrlosig, locondir);
1343 else { /* connecteur et signal existants, on redirige le connecteur */
1345 ptrlocon->DIRECTION = locondir;
1348 if(ptrcbhcomb !=NULL){
1349 cbh_addcombtolocon(ptrlocon, ptrcbhcomb);
1358 | TLF3_TOKEN_PIN '(' vpinname pintype pindir pinfunc vpintprops ')'
1361 for (i = lsb; i <= msb; i++) {
1362 vectname = namealloc (stm_vect (bname, i));
1363 ptfl = (float*)mbkalloc (sizeof (float));
1364 *ptfl = caparray[i - lsb];
1365 addhtitem (pincapht, vectname, (long)ptfl);
1366 addhtitem (pincapht, pname, (long)ptfl);
1381 consigchain = ttv_addrefsig (fig, vectname, vectname , *ptfl, dir, consigchain);
1384 clocks = addchain (clocks, vectname);
1390 pintype : TLF3_TOKEN_PINTYPE '(' TLF3_TOKEN_DATA ')'
1394 | TLF3_TOKEN_PINTYPE '(' TLF3_TOKEN_CLOCK ')'
1398 | TLF3_TOKEN_PINTYPE '(' TLF3_TOKEN_CLOCK clocktrans ')'
1402 | TLF3_TOKEN_PINTYPE '(' TLF3_TOKEN_CONTROL TLF3_TOKEN_ASYNCH clocktrans ')'
1406 | TLF3_TOKEN_PINTYPE '(' TLF3_TOKEN_GROUND ')'
1410 | TLF3_TOKEN_PINTYPE '(' TLF3_TOKEN_DATA TLF3_TOKEN_TRISTATE ')'
1416 pindir : TLF3_TOKEN_PINDIR '(' TLF3_TOKEN_INPUT ')'
1420 | TLF3_TOKEN_PINDIR '(' TLF3_TOKEN_OUTPUT ')'
1423 ptrcbhcomb = cbh_newcomb();
1424 ptrcbhcomb->NAME = namealloc(pname);
1426 | TLF3_TOKEN_PINDIR '(' TLF3_TOKEN_BIDIR ')'
1429 ptrcbhcomb = cbh_newcomb();
1430 ptrcbhcomb->NAME = pname;
1437 |TLF3_TOKEN_FUNCTION TLF3_TOKEN_EXPR
1440 str = eqt_ConvertStr($2);
1441 ptrcbhcomb->FUNCTION = eqt_StrToAbl(tlfEqtCtx,str);
1449 |TLF3_TOKEN_ENABLE TLF3_TOKEN_EXPR
1452 if(ptrcbhcomb != NULL) {
1453 str = eqt_ConvertStr($2);
1454 ptrcbhcomb->HZFUNC = notExpr(eqt_StrToAbl(tlfEqtCtx,str));
1460 pntprop_list : empty
1461 | pntprop_list pntprop
1464 pntprop : TLF3_TOKEN_TIMING_PROPS '(' pincap ')'
1468 | TLF3_TOKEN_TIMING_PROPS '(' ')'
1471 vpintprops : TLF3_TOKEN_TIMING_PROPS '(' forbits_list ')'
1476 forbits_list : forbits
1477 | forbits_list forbits
1480 forbits : TLF3_TOKEN_FOR_BITS '(' TLF3_TOKEN_VECT pincap ')'
1482 v = atoi (stm_unquote ($3));
1484 if (v <= msb && v >= lsb)
1485 caparray[v - lsb] = $4;
1489 pincap : TLF3_TOKEN_PIN_CAP '(' val ')'
1491 if (TLF_CAPA_UNIT == TLF_PF)
1493 if (TLF_CAPA_UNIT == TLF_FF)
1507 speed : TLF3_TOKEN_FAST
1512 path : TLF3_TOKEN_PATH '(' pinname "=>" pinname speed transition transition delay slew ')'
1514 if ($7 != 'X' && $8 != 'X') {
1517 mindlymname = $9.MIN ? $9.MIN : $9.MAX;
1518 minslwmname = $10.MIN ? $10.MIN : $10.MAX;
1519 maxdlymname = $9.MAX;
1520 maxslwmname = $10.MAX;
1521 signode = (ttvsig_list*)gethtitem (pinht, pinn);
1522 sigroot = (ttvsig_list*)gethtitem (pinht, pinr);
1523 if ((long)sigroot != EMPTYHT && (long)signode != EMPTYHT) {
1525 root = &sigroot->NODE[1];
1529 root = &sigroot->NODE[0];
1533 node = &signode->NODE[1];
1537 node = &signode->NODE[0];
1540 if (isclockpin (clocks, pinn))
1541 linetype = TTV_LINE_A;
1544 delaymodelmax = stm_getmodel (cname, maxdlymname);
1545 stm_mod_shrinkslewaxis (delaymodelmax, thmin, thmax, itype);
1547 slewmodelmax = stm_getmodel (cname, maxslwmname);
1548 stm_mod_shrinkslewaxis (slewmodelmax, thmin, thmax, itype);
1549 stm_mod_shrinkslewdata (slewmodelmax, thmin, thmax, otype);
1551 delaymodelmin = stm_getmodel (cname, mindlymname);
1552 stm_mod_shrinkslewaxis (delaymodelmin, thmin, thmax, itype);
1554 slewmodelmin = stm_getmodel (cname, minslwmname);
1555 stm_mod_shrinkslewaxis (slewmodelmin, thmin, thmax, itype);
1556 stm_mod_shrinkslewdata (slewmodelmin, thmin, thmax, otype);
1559 stm_mod_update(delaymodelmax, voltage/2.0, voltage, voltage/5.0, 0.0);
1560 stm_mod_update(slewmodelmax, voltage/2.0, voltage, voltage/5.0, 0.0);
1561 stm_mod_update(delaymodelmin, voltage/2.0, voltage, voltage/5.0, 0.0);
1562 stm_mod_update(slewmodelmin, voltage/2.0, voltage, voltage/5.0, 0.0);
1564 stm_mod_update(delaymodelmax, voltage/2.0, voltage, voltage/5.0, voltage);
1565 stm_mod_update(slewmodelmax, voltage/2.0, voltage, voltage/5.0, voltage);
1566 stm_mod_update(delaymodelmin, voltage/2.0, voltage, voltage/5.0, voltage);
1567 stm_mod_update(slewmodelmin, voltage/2.0, voltage, voltage/5.0, voltage);
1570 capa = gethtitem (pincapht, pinr);
1571 if (capa != EMPTYHT) {
1572 slwmin = stm_mod_slew (slewmodelmin, *(float*)capa + STM_DEF_LOAD, STM_DEF_SLEW, NULL, NULL, "unknown");
1573 dlymin = stm_mod_delay (delaymodelmin, *(float*)capa + STM_DEF_LOAD, STM_DEF_SLEW, NULL, "unknown");
1574 slwmax = stm_mod_slew (slewmodelmax, *(float*)capa + STM_DEF_LOAD, STM_DEF_SLEW, NULL, NULL, "unknown");
1575 dlymax = stm_mod_delay (delaymodelmax, *(float*)capa + STM_DEF_LOAD, STM_DEF_SLEW, NULL, "unknown");
1577 slwmin = stm_mod_slew (slewmodelmin, STM_DEF_LOAD, STM_DEF_SLEW, NULL, NULL, "unknown");
1578 dlymin = stm_mod_delay (delaymodelmin, STM_DEF_LOAD, STM_DEF_SLEW, NULL, "unknown");
1579 slwmax = stm_mod_slew (slewmodelmax, STM_DEF_LOAD, STM_DEF_SLEW, NULL, NULL, "unknown");
1580 dlymax = stm_mod_delay (delaymodelmax, STM_DEF_LOAD, STM_DEF_SLEW, NULL, "unknown");
1582 line = ttv_addline (fig, root, node, dlymax*TTV_UNIT, slwmax*TTV_UNIT, dlymin*TTV_UNIT, slwmin*TTV_UNIT, TTV_LINE_T | linetype);
1583 ttv_addcaracline (line, maxdlymname,
1587 line = ttv_addline (fig, root, node, dlymax*TTV_UNIT, slwmax*TTV_UNIT, dlymin*TTV_UNIT, slwmin*TTV_UNIT, TTV_LINE_D | linetype);
1588 ttv_addcaracline (line, maxdlymname,
1595 | TLF3_TOKEN_PATH '(' pinname "=>" pinname speed transition transition constdelay constslew ')'
1597 if ($7 != 'X' && $8 != 'X') {
1600 dlymin = $9.MIN != STM_NOVALUE ? $9.MIN * 1000 : $9.MAX * 1000;
1601 slwmin = $10.MIN != STM_NOVALUE ? $10.MIN * 1000 : $10.MAX * 1000;
1602 dlymax = $9.MAX * 1000;
1603 slwmax = $10.MAX * 1000;
1604 signode = (ttvsig_list*)gethtitem (pinht, pinn);
1605 sigroot = (ttvsig_list*)gethtitem (pinht, pinr);
1606 if ((long)sigroot != EMPTYHT && (long)signode != EMPTYHT) {
1608 root = &sigroot->NODE[1];
1610 root = &sigroot->NODE[0];
1612 node = &signode->NODE[1];
1614 node = &signode->NODE[0];
1615 if (isclockpin (clocks, pinn))
1616 linetype = TTV_LINE_A;
1619 line = ttv_addline (fig, root, node, dlymax*TTV_UNIT, slwmax*TTV_UNIT, dlymin*TTV_UNIT, slwmin*TTV_UNIT, TTV_LINE_T | linetype);
1620 line = ttv_addline (fig, root, node, dlymax*TTV_UNIT, slwmax*TTV_UNIT, dlymin*TTV_UNIT, slwmin*TTV_UNIT, TTV_LINE_D | linetype);
1626 setup : TLF3_TOKEN_SETUP '(' pinname "=>" pinname transition transition constraint ')'
1628 if ($6 != 'X' && $7 != 'X') {
1631 maxdlymname = $8.MAX;
1632 sigroot = (ttvsig_list*)gethtitem (pinht, pinr);
1633 signode = (ttvsig_list*)gethtitem (pinht, pinn);
1634 if ((long)sigroot != EMPTYHT && (long)signode != EMPTYHT) {
1636 root = &sigroot->NODE[1];
1638 root = &sigroot->NODE[0];
1640 node = &signode->NODE[1];
1644 node = &signode->NODE[0];
1648 delaymodelmax = stm_getmodel (cname, maxdlymname);
1649 stm_mod_shrinkslewaxis (delaymodelmax, thmin, thmax, itype);
1652 printf ("no model %s\n", maxdlymname);
1653 maxcstr = stm_mod_constraint (delaymodelmax, STM_DEF_SLEW, STM_DEF_SLEW);
1654 if (itype == elpFALL) {
1655 stm_mod_update(delaymodelmax, voltage/2.0, voltage, voltage/5.0, 0.0);
1657 stm_mod_update(delaymodelmax, voltage/2.0, voltage, voltage/5.0, voltage);
1659 line = ttv_addline (fig, root, node, maxcstr*TTV_UNIT, 0, TTV_NOTIME, TTV_NOSLOPE, TTV_LINE_T | TTV_LINE_U);
1660 ttv_addcaracline (line, maxdlymname, NULL, NULL, NULL);
1661 line = ttv_addline (fig, root, node, maxcstr*TTV_UNIT, 0, TTV_NOTIME, TTV_NOSLOPE, TTV_LINE_D | TTV_LINE_U);
1662 ttv_addcaracline (line, maxdlymname, NULL, NULL, NULL);
1666 | TLF3_TOKEN_SETUP '(' pinname "=>" pinname transition transition constant ')'
1668 if ($6 != 'X' && $7 != 'X') {
1671 maxcstr = $8.MAX * 1000;
1672 sigroot = (ttvsig_list*)gethtitem (pinht, pinr);
1673 signode = (ttvsig_list*)gethtitem (pinht, pinn);
1674 if ((long)sigroot != EMPTYHT && (long)signode != EMPTYHT) {
1676 root = &sigroot->NODE[1];
1678 root = &sigroot->NODE[0];
1680 node = &signode->NODE[1];
1682 node = &signode->NODE[0];
1683 line = ttv_addline (fig, root, node, maxcstr*TTV_UNIT, 0, TTV_NOTIME, TTV_NOSLOPE, TTV_LINE_T | TTV_LINE_U);
1684 line = ttv_addline (fig, root, node, maxcstr*TTV_UNIT, 0, TTV_NOTIME, TTV_NOSLOPE, TTV_LINE_D | TTV_LINE_U);
1690 hold : TLF3_TOKEN_HOLD '(' pinname "=>" pinname transition transition constraint ')'
1692 if ($6 != 'X' && $7 != 'X') {
1695 maxdlymname = $8.MAX;
1696 sigroot = (ttvsig_list*)gethtitem (pinht, pinr);
1697 signode = (ttvsig_list*)gethtitem (pinht, pinn);
1698 if ((long)sigroot != EMPTYHT && (long)signode != EMPTYHT) {
1700 root = &sigroot->NODE[1];
1702 root = &sigroot->NODE[0];
1704 node = &signode->NODE[1];
1708 node = &signode->NODE[0];
1712 delaymodelmax = stm_getmodel (cname, maxdlymname);
1713 stm_mod_shrinkslewaxis (delaymodelmax, thmin, thmax, itype);
1716 printf ("no model %s\n", maxdlymname);
1717 maxcstr = stm_mod_constraint (delaymodelmax, STM_DEF_SLEW, STM_DEF_SLEW);
1718 if (itype == elpFALL) {
1719 stm_mod_update(delaymodelmax, voltage/2.0, voltage, voltage/5.0, 0.0);
1721 stm_mod_update(delaymodelmax, voltage/2.0, voltage, voltage/5.0, voltage);
1723 line = ttv_addline (fig, root, node, TTV_NOTIME, TTV_NOSLOPE, mincstr*TTV_UNIT, 0, TTV_LINE_T | TTV_LINE_O);
1724 ttv_addcaracline (line, maxdlymname, NULL, NULL, NULL);
1725 line = ttv_addline (fig, root, node, TTV_NOTIME, TTV_NOSLOPE, mincstr*TTV_UNIT, 0, TTV_LINE_D | TTV_LINE_O);
1726 ttv_addcaracline (line, maxdlymname, NULL, NULL, NULL);
1730 | TLF3_TOKEN_HOLD '(' pinname "=>" pinname transition transition constant ')'
1732 if ($6 != 'X' && $7 != 'X') {
1735 maxcstr = $8.MAX * 1000;
1736 sigroot = (ttvsig_list*)gethtitem (pinht, pinr);
1737 signode = (ttvsig_list*)gethtitem (pinht, pinn);
1738 if ((long)sigroot != EMPTYHT && (long)signode != EMPTYHT) {
1740 root = &sigroot->NODE[1];
1742 root = &sigroot->NODE[0];
1744 node = &signode->NODE[1];
1746 node = &signode->NODE[0];
1747 line = ttv_addline (fig, root, node, maxcstr*TTV_UNIT, 0, TTV_NOTIME, TTV_NOSLOPE, TTV_LINE_T | TTV_LINE_O);
1748 line = ttv_addline (fig, root, node, maxcstr*TTV_UNIT, 0, TTV_NOTIME, TTV_NOSLOPE, TTV_LINE_D | TTV_LINE_O);
1754 transition : TLF3_TOKEN_10
1784 clocktrans : TLF3_TOKEN_NEGEDGE
1788 | TLF3_TOKEN_POSEDGE
1802 constraint : modelname
1804 if (gethtitem (doublemodels, namealloc ($1)) != EMPTYHT) {
1805 sprintf (namebuf, "%s_min", $1);
1806 $$.MIN = namealloc (namebuf);
1807 sprintf (namebuf, "%s_max", $1);
1808 $$.MAX = namealloc (namebuf);
1811 $$.MAX = namealloc ($1);
1816 delay : TLF3_TOKEN_DELAY '(' modelname ')'
1818 if (gethtitem (doublemodels, namealloc ($3)) != EMPTYHT) {
1819 sprintf (namebuf, "%s_min", $3);
1820 $$.MIN = namealloc (namebuf);
1821 sprintf (namebuf, "%s_max", $3);
1822 $$.MAX = namealloc (namebuf);
1825 $$.MAX = namealloc ($3);
1830 slew : TLF3_TOKEN_SLEW '(' modelname ')'
1832 if (gethtitem (doublemodels, namealloc ($3)) != EMPTYHT) {
1833 sprintf (namebuf, "%s_min", $3);
1834 $$.MIN = namealloc (namebuf);
1835 sprintf (namebuf, "%s_max", $3);
1836 $$.MAX = namealloc (namebuf);
1839 $$.MAX = namealloc ($3);
1844 templatename : empty
1854 vpinname : TLF3_TOKEN_VECT_IDENT
1856 bname = stm_basename ($1);
1860 lsb = l < m ? l : m;
1861 msb = m > l ? m : l;
1862 caparray = (float*)mbkalloc ((msb - lsb + 1) * sizeof (float));
1863 for (i = 0; i < msb - lsb; i++)
1864 caparray[i] = TLF_NO_CAPA;
1886 constant : TLF3_TOKEN_CONST '(' cval ')'
1890 | TLF3_TOKEN_CONST cval
1896 constdelay : TLF3_TOKEN_DELAY '(' TLF3_TOKEN_CONST '(' cval ')' ')'
1902 constslew : TLF3_TOKEN_SLEW '(' TLF3_TOKEN_CONST '(' cval ')' ')'
1908 cval : val ':' val ':' val
1920 $$.MIN = STM_NOVALUE;
1925 val : TLF3_TOKEN_NUMBER
1929 | TLF3_TOKEN_ENUMBER
1943 ident : TLF3_TOKEN_IDENT
1953 extern char stbtext[];
1957 avt_errmsg (STM_ERRMSG, "051", AVT_ERROR, TLF_LINE);