1 /****************************************************************************/
3 /* Chaine de CAO & VLSI AVERTEC */
5 /* Produit : VECTABL Version 1.00 */
6 /* Fichier : log_vectabl.c */
8 /* (c) copyright 2002 AVERTEC */
9 /* Tous droits reserves */
11 /* Auteur(s) : Antony PINTO */
13 /****************************************************************************/
22 /*}}}************************************************************************/
24 /* functions declarations */
26 /****************************************************************************/
27 char *replicateBitStr ( char *bitstr
,
29 chain_list
*concatAbl ( chain_list
*expr1
,
31 chain_list
*replicateAbl ( chain_list
*expr
,
33 chain_list
*getAblAtPos ( chain_list
*expr
,
35 int getVectAblRange ( chain_list
*expr
,
38 char *getVectAblVarName ( chain_list
*expr
);
39 int verifyVectAbl ( chain_list
*expr
);
40 int getAtomSize ( chain_list
*expr
);
41 chain_list
*getAblAtIndex ( chain_list
*expr
,
45 chain_list
*createBitStr ( char *bitstr
);
46 int isBitStr ( char *bitstr
);
47 void freeBitStrTable ( );
48 char *makeBitStr ( char *bistr
);
49 char *invertBitStr ( char *bitstr
);
50 chain_list
*downCat(chain_list
*expr
);
52 ht
*LOG_BITSTRTABLE
= NULL
;
54 char *genBitStr(int n
,char car
);
56 /****************************************************************************/
60 /****************************************************************************/
61 chain_list
*concatAbl(chain_list
*expr1
, chain_list
*expr2
)
67 vectSize
= verifyVectAbl(expr1
) + verifyVectAbl(expr2
);
69 if (!ATOM(expr1
) && OPER(expr1
)==CAT
)
72 for (chainx
=resExpr
->NEXT
; chainx
->NEXT
; chainx
=chainx
->NEXT
)
74 if (!ATOM(expr2
) && OPER(expr2
)==CAT
)
76 freechain(CAR(expr2
));
77 expr2
= delchain(expr2
,expr2
);
80 expr2
= addchain(NULL
,expr2
);
81 // addQExpr(resExpr,expr2);
84 else if (!ATOM(expr2
) && OPER(expr2
)==CAT
)
88 addHExpr(resExpr
,expr1
);
90 // else if (OPER(expr1)==REPLICATE)
91 // else if (OPER(expr2)==REPLICATE)
92 else if (!ATOM(expr1
) && !ATOM(expr2
)
93 && OPER(expr1
) == OPER(expr2
)
94 && lengthExpr(expr1
) == lengthExpr(expr2
))
96 resExpr
= createExpr(OPER(expr1
));
97 while ((expr1
= CDR(expr1
)) && (expr2
= CDR(expr2
)))
98 addQExpr(resExpr
,concatAbl(CAR(expr1
),CAR(expr2
)));
102 resExpr
= createExpr(CAT
);
103 addHExpr(resExpr
,expr2
);
104 addHExpr(resExpr
,expr1
);
108 VECT_S(resExpr
) = vectSize
;
110 CDAR(resExpr
) = addchain(NULL
,(void *)(long)vectSize
);
115 /*}}}************************************************************************/
118 /* reduce a concatenation by grouping same atom radical */
119 /* return the way of the reduce operation 0 for upto, 1 for downto */
120 /****************************************************************************/
121 /*int simplifyCat(chain_list *expr)
123 chain_list *tmp = expr;
127 else if (OPER(expr) == CAT)
135 while (tmp = CDR(tmp))
136 return simplifyCat(CAR(expr));
140 /*}}}************************************************************************/
141 /*{{{ replicateAbl() */
144 /****************************************************************************/
145 chain_list
*replicateAbl(chain_list
*expr
, int n
)
152 if (!ATOM(resExpr
) && OPER(resExpr
)==REPLICATE
)
154 replicateTimes
= (int)(VECT_S(resExpr
) * n
);
155 vectSize
= verifyVectAbl(resExpr
) * n
;
156 VECT_S(resExpr
) = vectSize
;
157 REP_NB(resExpr
) = replicateTimes
;
159 else if (ATOM(resExpr
) && isBitStr(resExpr
->DATA
))
161 resExpr
->DATA
= replicateBitStr(expr
->DATA
,n
);
165 resExpr
= createExpr(REPLICATE
);
166 CDR(resExpr
) = addchain(NULL
,expr
);
168 vectSize
= verifyVectAbl(expr
) * n
;
169 CDAR(resExpr
) = addchain(NULL
,(void *)(long)n
);
170 CDAR(resExpr
) = addchain(CDAR(resExpr
),(void *)(long)vectSize
);
176 /*}}}************************************************************************/
177 /*{{{ getAblAtPos() */
180 /****************************************************************************/
181 chain_list
*getAblAtPos(chain_list
*expr
, int pos
)
183 chain_list
*resExpr
= NULL
;
194 vectSize
= verifyVectAbl(expr
);
200 if (getAtomSize(expr
) == 1)
201 resExpr
= addchain(NULL
,expr
->DATA
);
202 else if (isBitStr(expr
->DATA
))
204 sprintf(buf
,"'%c'",((char*)expr
->DATA
)[pos
+1]);
205 resExpr
= addchain(NULL
,namealloc(buf
));
209 bit
= getVectAblRange(expr
,&left
,NULL
);
210 bit
= left
+ (bit
* pos
);
211 sprintf(buf
,"%s %d",getVectAblVarName(expr
),bit
);
212 resExpr
= addchain(NULL
,namealloc(buf
));
215 else if (vectSize
== 1)
216 resExpr
= copyExpr(expr
);
217 else if (OPER(expr
) == CAT
)
219 for (chainx
= expr
->NEXT
; chainx
; chainx
= chainx
->NEXT
)
221 countNext
= count
+ verifyVectAbl(CAR(chainx
));
227 resExpr
= getAblAtPos(CAR(chainx
),pos
-count
);
229 else if (OPER(expr
) == REPLICATE
)
231 count
= VECT_S(expr
)/REP_NB(expr
);
233 resExpr
= getAblAtPos(CADR(expr
),0);
235 resExpr
= getAblAtPos(CADR(expr
),pos
%count
);
239 resExpr
= createExpr(OPER(expr
));
241 for (chainx
= expr
->NEXT
; chainx
; chainx
= chainx
->NEXT
)
243 subExpr
= getAblAtPos(CAR(chainx
),pos
);
244 exprx
->NEXT
= addchain(NULL
,subExpr
);
255 /*}}}************************************************************************/
258 /* move concatenation to leaf */
259 /****************************************************************************/
260 chain_list
*downCat(chain_list
*expr
)
264 if (OPER(expr
) == CAT
)
266 chain_list
*abl
= expr
;
267 chain_list
*res
= CADR(expr
);
269 while ((abl
= CDR(abl
)))
270 if (isBitStr(VALUE_ATOM(CAR(abl
))))
273 while ((abl
= CDR(abl
)))
274 res
= concatAbl(res
,CAR(abl
));
284 /*}}}************************************************************************/
285 /*{{{ getVectAblRange() */
288 /****************************************************************************/
289 int getVectAblRange(chain_list
*expr
, int *left
, int *right
)
299 if ((pos2
= (long)strchr(expr
->DATA
,':')))
301 pos1
= (long)strchr(expr
->DATA
,' ');
302 leFt
= atoi((char *)(pos1
+1));
303 riGht
= atoi((char *)(pos2
+1));
304 if (left
) *left
= leFt
;
305 if (right
) *right
= riGht
;
306 res
= (leFt
>riGht
)?-1:1;
315 /*}}}************************************************************************/
316 /*{{{ repToCatVectAbl() */
318 /* convert a replicate abl onto a cat abl */
320 /****************************************************************************/
321 void repToCatVectAbl(chain_list
*expr
)
329 if (OPER(expr
) == REPLICATE
)
332 resExpr
= addchain(NULL
,NULL
);
333 CAR(resExpr
) = CAR(expr
);
335 CDR(CDAR(resExpr
)) = delchain(CDR(CDAR(resExpr
)),CDR(CDAR(resExpr
)));
336 for (i
= 0; i
< nb
; i
++)
338 cpyExpr
= copyExpr(expr
);
339 for (tmpExpr
= cpyExpr
; CDR(tmpExpr
); tmpExpr
= CDR(tmpExpr
))
341 CDR(tmpExpr
) = CDR(resExpr
);
342 CDR(resExpr
) = CDR(cpyExpr
);
346 CDR(expr
) = CDR(resExpr
);
347 delchain(resExpr
,resExpr
);
351 /*}}}************************************************************************/
352 /*{{{ changeAblAtRange() */
354 /* substitute abl on range by a new abl */
355 /* mode 1 only subsitute undefined abl on range */
357 /* expr : 0 left right n */
358 /* +-------+--------+------+ */
359 /* |xxxxxxx| added |xxxxxx| */
360 /* +-------+--------+------+ */
361 /* mode 1 |xxxxxxx|"UUUUUU"|xxxxxx| */
362 /* mode 2 |xxxxxxx|existing|xxxxxx| */
363 /* +-------+--------+------+ */
365 /* +---/|\-----------------+ */
367 /* pos (current position) */
369 /****************************************************************************/
370 int changeAblAtRange(chain_list
*expr
,int left
,int right
,chain_list
*added
,
379 int al
,ar
; // atome caracterisation
385 if ((vsize
= verifyVectAbl(expr
)) >= right
)
395 if (isBitStr(VALUE_ATOM(expr
)))
397 for (i
= left
; i
<= right
; i
++)
398 if ( (VALUE_ATOM(expr
))[i
+1] != 'u')
404 if (isBitStr(VALUE_ATOM(expr
)))
406 sprintf(buf1
,"%s",VALUE_ATOM(expr
)); // before
407 buf1
[0] = (left
== 1) ? '\'' : '"';
408 buf1
[left
+1] = (left
== 1) ? '\'' : '"';
410 nl
= (left
== 0) ? NULL
: createBitStr(buf1
);
412 sprintf(buf2
,"%s",VALUE_ATOM(expr
)); // after
413 buf2
[vsize
+1] = (right
== vsize
-1) ? '\'' : '"';
414 buft
= (char*)((long)&buf2
+ right
+ 1);
415 buft
[0] = (right
== vsize
-1) ? '\'' : '"';
416 nr
= (right
== vsize
-1) ? NULL
: createBitStr(buft
);
420 getVectAtomRange(expr
,&an
,&al
,&ar
);
421 if (al
<ar
) // good range direction
423 nl
= createVectAtom(an
, al
, al
+left
-1);
424 nr
= createVectAtom(an
, al
+right
+1, ar
);
428 nl
= createVectAtom(an
, al
, al
-left
+1);
429 nr
= createVectAtom(an
, al
-right
-1, ar
);
433 tmpExpr
= (nl
) ? concatAbl(nl
,added
) : added
;
434 tmpExpr
= (nr
) ? concatAbl(tmpExpr
,nr
) : tmpExpr
;
435 // tmpExpr = downCat(tmpExpr);
436 CAR(expr
) = CAR(tmpExpr
);
437 CDR(expr
) = CDR(tmpExpr
);
438 delchain(tmpExpr
,tmpExpr
);
441 else switch (OPER(expr
))
446 for (i
= 0; abl
;abl
= CDR(abl
))
448 tmp
= verifyVectAbl(CAR(abl
));
449 if (i
<= left
&& right
< tmp
+i
)
451 if (changeAblAtRange(CAR(abl
),left
-i
,right
-i
,added
,mode
))
453 chain_list
*delExpr
= NULL
;
456 if (OPER(CAR(abl
)) == CAT
)
460 CAR(abl
) = CAR(CDR(delExpr
));
461 CDR(abl
) = CDR(CDR(delExpr
));
468 abl2
= downCat(expr
);
469 CDR(expr
) = CDR(abl2
);
470 CAR(expr
) = CAR(abl2
);
479 repToCatVectAbl(expr
);
480 return changeAblAtRange(expr
,left
,right
,added
,mode
);
482 avt_errmsg(LOG_ERRMSG
,"000",AVT_ERROR
,"157");
483 // printf("pas traite changeAblAtRange() def\n");
492 /*}}}************************************************************************/
493 /*{{{ createVectAtomName() */
496 /****************************************************************************/
497 char *createVectAtomName(char *name
,int left
,int right
)
502 sprintf(buf
,"%s %d:%d",name
,left
,right
);
504 sprintf(buf
,"%s %d",name
,left
);
505 return namealloc(buf
);
508 /*}}}************************************************************************/
509 /*{{{ createVectAtom() */
512 /****************************************************************************/
513 chain_list
*createVectAtom(char *name
,int left
,int right
)
515 return createAtom(createVectAtomName(name
,left
,right
));
518 /*}}}************************************************************************/
519 /*{{{ getVectAtomRange() */
522 /****************************************************************************/
523 void getVectAtomRange(chain_list
*expr
,char **name
,int *left
, int*right
)
531 sprintf(buf
,"%s",(char *)expr
->DATA
);
532 while (buf
[i
] != ' ') i
++;
534 *name
= namealloc(buf
);
536 while (buf
[i
] != '\0')
555 /*}}}************************************************************************/
556 /*{{{ getAblAtIndex() */
559 /****************************************************************************/
560 chain_list
*getAblAtIndex(chain_list
*expr
,int left
,int right
,int index
)
568 return getAblAtPos(expr
,pos
);
571 /*}}}************************************************************************/
572 /*{{{ getVectAblVarName() */
575 /****************************************************************************/
576 char *getVectAblVarName(chain_list
*expr
)
584 sprintf(buf
,"%s",(char *)expr
->DATA
);
585 while (buf
[i
]!=' ' && buf
[i
] != '\0')
588 res
= namealloc(buf
);
595 /*}}}************************************************************************/
596 /*{{{ initBitStrTable() */
599 /****************************************************************************/
600 void initBitStrTable()
602 LOG_BITSTRTABLE
= addht(200);
603 addhtitem(LOG_BITSTRTABLE
,namealloc("'0'"),1);
604 addhtitem(LOG_BITSTRTABLE
,namealloc("'1'"),1);
605 addhtitem(LOG_BITSTRTABLE
,namealloc("'d'"),1);
606 addhtitem(LOG_BITSTRTABLE
,namealloc("'u'"),1);
607 addhtitem(LOG_BITSTRTABLE
,namealloc("'z'"),1);
610 /*}}}************************************************************************/
611 /*{{{ verifyVectAbl() */
614 /****************************************************************************/
615 int verifyVectAbl(chain_list
*expr
)
622 res
= getAtomSize(expr
);
623 else if (CDAR(expr
) && VECT_S(expr
))
624 res
= (int)VECT_S(expr
);
627 for (chainx
=expr
->NEXT
;chainx
;chainx
=chainx
->NEXT
)
629 vectSize
= verifyVectAbl(CAR(chainx
));
630 if (!res
) res
= vectSize
;
631 else if (vectSize
!=res
)
637 CDAR(expr
) = addchain(NULL
,(void *)(long)res
);
643 /*}}}************************************************************************/
644 /*{{{ getAtomSize() */
647 /****************************************************************************/
648 int getAtomSize(chain_list
*expr
)
654 if (isBitStr(expr
->DATA
))
655 res
= strlen(expr
->DATA
) - 2;
656 else if ((pos2
= (long)strchr(expr
->DATA
,':')))
658 pos1
= (long)strchr(expr
->DATA
,' ');
662 res
= abs(atoi((char *)(pos1
+1)) - atoi((char *)(pos2
+1))) + 1;
669 /*}}}************************************************************************/
670 /*{{{ invertVectAbl() */
673 /****************************************************************************/
674 void invertVectAbl(chain_list
*expr
)
678 if (ATOM(expr
)) invertAtom(expr
);
679 else switch (OPER(expr
))
682 CDR(expr
) = reverse(CDR(expr
));
684 for (chainx
=CDR(expr
);chainx
;chainx
=chainx
->NEXT
)
685 invertVectAbl(CAR(chainx
));
689 /*}}}************************************************************************/
690 /*{{{ invertAtom() */
693 /****************************************************************************/
694 void invertAtom(chain_list
*expr
)
705 name
= mbkstrdup(expr
->DATA
);
706 if (isBitStr(expr
->DATA
))
708 expr
->DATA
= invertBitStr(expr
->DATA
);
710 else if ((pos2
= strchr(name
,':')))
712 pos1
= strchr(name
,' ');
716 sprintf(buf
,"%s %d:%d",name
,right
,left
);
717 expr
->DATA
= namealloc(buf
);
723 /*}}}************************************************************************/
724 /*{{{ invertBitStr() */
727 /****************************************************************************/
728 char *invertBitStr(char *bitstr
)
734 sprintf(tmp
,"%s",bitstr
);
735 for (i
=strlen(tmp
)-1,j
=0;i
>=0;i
--,j
++)
739 return makeBitStr(buf
);
742 /*}}}************************************************************************/
743 /*{{{ createBitStr() */
746 /****************************************************************************/
747 chain_list
*createBitStr(char *bitstr
)
749 if (*bitstr
== '\'' || *bitstr
== '"')
750 return createAtom(makeBitStr(bitstr
));
755 if (*(bitstr
+1) != '\0')
756 sprintf(buf
,"\"%s\"",bitstr
);
758 sprintf(buf
,"'%s'",bitstr
);
759 return createAtom(makeBitStr(buf
));
763 /*}}}************************************************************************/
764 /*{{{ makeBitStr() */
766 /* fait d'une chaine de caractere une bitstring */
767 /****************************************************************************/
768 char *makeBitStr(char *bitstr
)
772 res
= namealloc(bitstr
);
773 if (!LOG_BITSTRTABLE
)
775 addhtitem(LOG_BITSTRTABLE
,res
,1);
780 /*}}}************************************************************************/
781 /*{{{ genOneBitStr() */
783 /* generate a bitstring of one (n lenght) */
784 /****************************************************************************/
785 char *genOneBitStr(int n
)
787 return genBitStr(n
,'1');
790 /*}}}************************************************************************/
791 /*{{{ genZeroBitStr() */
793 /* generate a bitstring of zero (n lenght) */
794 /****************************************************************************/
795 char *genZeroBitStr(int n
)
797 return genBitStr(n
,'0');
800 /*}}}************************************************************************/
801 /*{{{ genHZBitStr() */
803 /* generate a bitstring of one (n lenght) */
804 /****************************************************************************/
805 char *genHZBitStr(int n
)
807 return genBitStr(n
,'z');
810 /*}}}************************************************************************/
814 /****************************************************************************/
815 char *genBitStr(int n
,char car
)
820 buf
[0] = (n
== 1) ? '\'' : '"';
821 for (i
= 1; i
<= n
; )
823 buf
[i
++] = (n
== 1) ? '\'' : '"';
826 return makeBitStr(buf
);
829 /*}}}************************************************************************/
830 /*{{{ replicateBitStr() */
833 /****************************************************************************/
834 char *replicateBitStr(char *bitstr
, int n
)
841 len
= strlen(bitstr
) - 2;
842 for (j
= 0; j
< n
; j
++)
843 for (i
= 1; i
<= len
; i
++)
844 buf
[k
++] = bitstr
[i
];
849 return makeBitStr(buf
);
852 /*}}}************************************************************************/
853 /*{{{ fprintHZBitStr() */
856 /****************************************************************************/
857 void fprintHZBitStr(FILE *file
,char *bitstr
)
860 unsigned int n
= strlen(bitstr
) - 2;
862 fprintf(file
,"%c",(n
== 1) ? '\'' : '"');
863 for (i
= 0; i
< n
; i
++)
865 fprintf(file
,"%c",(n
== 1) ? '\'' : '"');
868 /*}}}************************************************************************/
869 /*{{{ genUBitStr() */
871 /* generate a bitstring of one (n lenght) */
872 /****************************************************************************/
873 char *genUBitStr(int n
)
875 return genBitStr(n
,'u');
878 /*}}}************************************************************************/
881 /* create an easy to drive copy of the bitstring */
883 /****************************************************************************/
884 char *getBitStr(char *str
)
891 for (i
= 0, j
= 0; i
<= n
; i
++)
895 case 'u' : buf
[j
++] = 'U'; break;
896 case 'z' : buf
[j
++] = 'Z'; break;
897 case 'd' : buf
[j
++] = 'D'; break;
898 default : buf
[j
++] = str
[i
]; break;
901 return mbkstrdup(buf
);
904 /*}}}************************************************************************/
905 /*{{{ fprintUBitStr() */
908 /****************************************************************************/
909 void fprintUBitStr(FILE *file
,char *bitstr
)
914 n
= strlen(bitstr
)-2;
920 for (i
= 0; i
< n
; i
++)
928 /*}}}************************************************************************/
931 /* invert a bitstring */
932 /****************************************************************************/
933 char *notBitStr(char *bitstr
)
938 for (i
= 0; bitstr
[i
-1] != '\0'; i
++)
939 if (bitstr
[i
] == '0')
941 else if (bitstr
[i
] == '1')
946 return makeBitStr(buf
);
949 /*}}}************************************************************************/
953 /****************************************************************************/
954 int isBitStr(char *bitstr
)
956 if (!LOG_BITSTRTABLE
)
959 (gethtitem(LOG_BITSTRTABLE
,bitstr
) == 1);
962 /*}}}************************************************************************/
963 /*{{{ freeBitStrTable() */
966 /****************************************************************************/
967 void freeBitStrTable()
969 delht(LOG_BITSTRTABLE
);