7 # include "lclintMacros.nf"
10 # include "cgrammar_tokens.h"
12 # include "exprChecks.h"
13 # include "aliasChecks.h"
14 # include "exprNodeSList.h"
17 # include "exprData.i"
18 # include "exprDataQuite.i"
23 #include "constraintExpr.h"
28 constraintExpr constraintExpr_parseMakeBinaryOp (constraintExpr expr1, lltok op, constraintExpr expr2);
30 constraintExpr constraintExpr_makeMaxSetConstraintExpr (constraintExpr c);
32 bool constraintExpr_isLit (constraintExpr expr)
36 if (expr->kind == term)
38 constraintTerm term = constraintExprData_termGetTerm (expr->data);
39 if (constraintTerm_isIntLiteral (term) )
49 constraintExpr constraintExpr_propagateConstants (constraintExpr expr,
50 /*@out@*/ bool * propagate,
51 /*@out@*/ int *literal)
55 bool propagate1, propagate2;
56 int literal1, literal2;
69 // we simplify unaryExpr else where
70 if (expr->kind == unaryExpr)
73 if (expr->kind == term)
76 if (constraintExpr_isLit (expr) )
79 BPRINTF( (message("constraintExpr_propagateConstants: binaryexpr: %s", constraintExpr_unparse(expr) ) ) );
81 expr1 = constraintExprData_binaryExprGetExpr1(expr->data);
82 expr2 = constraintExprData_binaryExprGetExpr2(expr->data);
84 expr1 = constraintExpr_propagateConstants (expr1, &propagate1, &literal1);
85 expr2 = constraintExpr_propagateConstants (expr2, &propagate2, &literal2);
87 expr->data = constraintExprData_binaryExprSetExpr1 (expr->data, expr1);
88 expr->data = constraintExprData_binaryExprSetExpr2 (expr->data, expr2);
90 *propagate = propagate1 || propagate2;
91 *literal = literal1 + literal2;
93 if ( constraintExpr_isLit (expr1) && constraintExpr_isLit (expr2) )
96 t1 = constraintExpr_getValue (expr1);
97 t2 = constraintExpr_getValue (expr2);
99 if (constraintExprData_binaryExprGetOp (expr->data) == PLUS )
100 return (constraintExpr_makeIntLiteral ( (t1+t2) ));
101 else if (constraintExprData_binaryExprGetOp (expr->data) == MINUS)
102 return (constraintExpr_makeIntLiteral ( (t1-t2) ));
107 if (constraintExpr_isLit (expr1) )
110 /*handle MINUS case right */
112 *literal += constraintExpr_getValue (expr1);
117 if (constraintExpr_isLit (expr2) )
121 if (constraintExprData_binaryExprGetOp (expr->data) == PLUS )
122 *literal += constraintExpr_getValue (expr2);
124 *literal -= constraintExpr_getValue (expr2);
130 BPRINTF( (message("constraintExpr_propagateConstants returning: %s", constraintExpr_unparse(expr) ) ) );
135 constraintExpr constraintExpr_combineConstants (constraintExpr expr )
140 BPRINTF ( (message ("Before combine %s", constraintExpr_unparse(expr) ) ) );
141 expr = constraintExpr_propagateConstants (expr, &propagate, &literal);
150 ret = constraintExpr_makeBinaryOpConstraintExprIntLiteral (expr, literal);
154 BPRINTF ( (message ("After combine %s", constraintExpr_unparse(expr) ) ) );
158 constraintExpr constraintExpr_alloc (void)
161 ret = dmalloc (sizeof (*ret) );
168 constraintExpr constraintExpr_copy (constraintExpr expr)
171 ret = constraintExpr_alloc();
172 ret->kind = expr->kind;
173 ret->data = constraintExprData_copy (expr->data, expr->kind);
178 constraintExpr oldconstraintExpr_makeTermExprNode (exprNode e)
182 ret = constraintExpr_alloc();
184 ret->data = dmalloc (sizeof *(ret->data) );
185 t = constraintTerm_makeExprNode (e);
186 ret->data = constraintExprData_termSetTerm (ret->data, t);
190 constraintExpr constraintExpr_makeExprNode (exprNode e)
193 constraintExpr ret, ce1, ce2;
206 t = exprData_getSingle (data);
207 s = exprNode_getSref (t);
208 if (sRef_isFixedArray(s) )
212 size = sRef_getArraySize(s);
213 ret = constraintExpr_makeIntLiteral (size);
217 BPRINTF ((message ("could not determine the size of %s", exprNode_unparse (e) ) ) );
218 ret = oldconstraintExpr_makeTermExprNode (e);
223 BPRINTF ((message ("Examining operation %s", exprNode_unparse (e) ) ) );
224 t1 = exprData_getOpA (data);
225 t2 = exprData_getOpB (data);
226 tok = exprData_getOpTok (data);
228 if (lltok_isPlus_Op (tok) || lltok_isMinus_Op (tok) )
230 ce1 = constraintExpr_makeExprNode (t1);
231 ce2 = constraintExpr_makeExprNode (t2);
232 ret = constraintExpr_parseMakeBinaryOp (ce1, tok, ce2);
236 ret = oldconstraintExpr_makeTermExprNode (e);
240 t = exprData_getUopNode (data);
241 ret = constraintExpr_makeExprNode (t);
245 t = exprData_getUopNode (data);
246 tok = exprData_getUopTok (data);
247 if (lltok_isInc_Op (tok) )
250 temp = constraintExpr_makeExprNode(t);
251 ret = constraintExpr_makeIncConstraintExpr(temp);
253 else if (lltok_isDec_Op (tok) )
256 temp = constraintExpr_makeExprNode(t);
257 ret = constraintExpr_makeDecConstraintExpr(temp);
260 ret = oldconstraintExpr_makeTermExprNode (e);
264 t = exprData_getUopNode (data);
265 ret = constraintExpr_makeExprNode (t);
268 ret = oldconstraintExpr_makeTermExprNode (e);
275 constraintExpr constraintExpr_makeTermExprNode (exprNode e)
277 return oldconstraintExpr_makeTermExprNode(e); //constraintExpr_makeExprNode (e);
281 constraintExpr constraintExpr_makeTermsRef (sRef s)
285 ret = constraintExpr_alloc();
287 ret->data = dmalloc (sizeof *(ret->data) );
288 t = constraintTerm_makesRef (s);
289 ret->data = constraintExprData_termSetTerm (ret->data, t);
293 constraintExpr constraintExpr_makeUnaryOp (void)
296 ret = constraintExpr_alloc();
297 ret->kind = unaryExpr;
298 ret->data = dmalloc ( sizeof *(ret->data) );
302 constraintExpr constraintExpr_makeUnaryOpConstraintExpr (constraintExpr cexpr)
305 ret = constraintExpr_makeUnaryOp();
306 ret->data = constraintExprData_unaryExprSetExpr (ret->data, cexpr);
310 constraintExpr constraintExpr_makeMaxSetConstraintExpr (constraintExpr c)
313 ret = constraintExpr_makeUnaryOpConstraintExpr (c);
314 ret->data = constraintExprData_unaryExprSetOp (ret->data, MAXSET);
318 constraintExpr constraintExpr_makeUnaryOpExprNode (exprNode expr)
322 sub = constraintExpr_makeExprNode (expr);
323 ret = constraintExpr_makeUnaryOpConstraintExpr(sub);
329 constraintExpr constraintExpr_makeSRefUnaryOp (sRef s, constraintExprUnaryOpKind op)
334 t = constraintExpr_makeTermsRef (s);
335 ret = constraintExpr_makeUnaryOpConstraintExpr (t);
336 ret->data = constraintExprData_unaryExprSetOp (ret->data, op);
340 constraintExpr constraintExpr_makeSRefMaxset (sRef s)
342 return (constraintExpr_makeSRefUnaryOp (s, MAXSET) );
345 constraintExpr constraintExpr_parseMakeUnaryOp (lltok op, constraintExpr cexpr)
348 ret = constraintExpr_makeUnaryOpConstraintExpr ( cexpr);
353 ret->data = constraintExprData_unaryExprSetOp (ret->data, MAXSET);
356 ret->data = constraintExprData_unaryExprSetOp (ret->data, MAXREAD);
359 llfatalbug("Unhandled Operation in Constraint");
364 constraintExpr constraintExpr_makeMaxSetExpr (exprNode expr)
367 ret = constraintExpr_makeExprNode (expr);
369 ret = constraintExpr_makeMaxSetConstraintExpr (ret);
375 constraintExpr constraintExpr_makeMaxReadExpr (exprNode expr)
378 ret = constraintExpr_makeUnaryOpExprNode(expr);
379 ret->data = constraintExprData_unaryExprSetOp (ret->data, MAXREAD);
383 constraintExpr constraintExpr_makeMinSetExpr (exprNode expr)
386 ret = constraintExpr_makeUnaryOpExprNode(expr);
387 ret->data = constraintExprData_unaryExprSetOp (ret->data, MINSET);
391 constraintExpr constraintExpr_makeMinReadExpr (exprNode expr)
394 ret = constraintExpr_makeUnaryOpExprNode(expr);
395 ret->data = constraintExprData_unaryExprSetOp (ret->data, MINREAD);
400 constraintExpr constraintExpr_makeValueExpr (exprNode expr)
403 ret = constraintExpr_makeExprNode (expr);
407 constraintExpr constraintExpr_makeIntLiteral (int i)
411 ret = constraintExpr_alloc();
413 ret->data = dmalloc (sizeof *(ret->data) );
414 t = constraintTerm_makeIntLiteral (i);
415 ret->data = constraintExprData_termSetTerm (ret->data, t);
420 constraintExpr constraintExpr_makeValueInt (int i)
422 return constraintExpr_makeIntLiteral (i);
425 static constraintExpr constraintExpr_makeBinaryOp (void)
428 ret = constraintExpr_alloc();
429 ret->kind = binaryexpr;
430 ret->data = dmalloc ( sizeof *(ret->data) );
431 ret->data = constraintExprData_binaryExprSetOp (ret->data, PLUS);
436 constraintExpr constraintExpr_makeBinaryOpConstraintExpr (constraintExpr expr1,constraintExpr expr2)
440 ret = constraintExpr_makeBinaryOp();
441 ret->data = constraintExprData_binaryExprSetExpr1 (ret->data, expr1);
442 ret->data = constraintExprData_binaryExprSetExpr2 (ret->data, expr2);
446 constraintExpr constraintExpr_parseMakeBinaryOp (constraintExpr expr1, lltok op, constraintExpr expr2)
449 ret = constraintExpr_makeBinaryOpConstraintExpr (expr1, expr2);
451 ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
452 else if (op.tok == TMINUS)
453 ret->data = constraintExprData_binaryExprSetOp(ret->data, MINUS);
461 constraintExpr constraintExpr_makeBinaryOpExprNode (exprNode expr1, exprNode expr2)
464 constraintExpr sub1, sub2;
465 sub1 = constraintExpr_makeTermExprNode (expr1);
466 sub2 = constraintExpr_makeTermExprNode (expr2);
467 ret = constraintExpr_makeBinaryOpConstraintExpr(sub1, sub2);
471 constraintExpr constraintExpr_makeBinaryOpConstraintExprIntLiteral (constraintExpr expr, int literal)
474 constraintExpr constExpr;
476 constExpr = constraintExpr_makeIntLiteral (literal);
477 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, constExpr);
478 ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
482 constraintExpr constraintExpr_makeDecConstraintExpr (constraintExpr expr)
487 inc = constraintExpr_makeIntLiteral (1);
488 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, inc);
489 ret->data = constraintExprData_binaryExprSetOp(ret->data, MINUS);
493 constraintExpr constraintExpr_makeAddConstraintExpr (constraintExpr expr, constraintExpr add)
497 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, add);
499 ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
504 constraintExpr constraintExpr_makeIncConstraintExpr (constraintExpr expr)
509 inc = constraintExpr_makeIntLiteral (1);
510 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, inc);
511 ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
515 cstring constraintExprUnaryOpKind_print (constraintExprUnaryOpKind op)
520 return message("MAXSET");
522 return message("MINSET");
524 return message("MAXREAD");
526 return message("MINREAD");
529 return message ("<(Unary OP OTHER>");
534 cstring constraintExprBinaryOpKind_print (constraintExprBinaryOpKind op)
545 return message ("<binary OP Unknown>");
548 bool constraintExpr_similar (constraintExpr expr1, constraintExpr expr2)
550 constraintExprKind kind;
552 llassert (expr1 != NULL);
553 llassert (expr2 != NULL);
554 if (expr1->kind != expr2->kind)
562 return constraintTerm_similar (constraintExprData_termGetTerm(expr1->data),
563 constraintExprData_termGetTerm(expr2->data) );
567 if (constraintExprData_unaryExprGetOp (expr1->data) != constraintExprData_unaryExprGetOp (expr2->data) )
570 return (constraintExpr_similar (
571 constraintExprData_unaryExprGetExpr (expr1->data),
572 constraintExprData_unaryExprGetExpr (expr2->data)
576 if (constraintExprData_binaryExprGetOp (expr1->data) != constraintExprData_binaryExprGetOp (expr2->data) )
579 if (! constraintExpr_similar (constraintExprData_binaryExprGetExpr1 (expr1->data),
580 constraintExprData_binaryExprGetExpr1 (expr2->data)) )
583 if (! constraintExpr_similar (constraintExprData_binaryExprGetExpr2 (expr1->data),
584 constraintExprData_binaryExprGetExpr2 (expr2->data)) )
599 bool constraintExpr_same (constraintExpr expr1, constraintExpr expr2)
601 constraintExprKind kind;
603 llassert (expr1 != NULL);
604 llassert (expr2 != NULL);
605 if (expr1->kind != expr2->kind)
613 return constraintTerm_similar (constraintExprData_termGetTerm(expr1->data),
614 constraintExprData_termGetTerm(expr2->data) );
618 if (constraintExprData_unaryExprGetOp (expr1->data) != constraintExprData_unaryExprGetOp (expr2->data) )
621 return (constraintExpr_same (
622 constraintExprData_unaryExprGetExpr (expr1->data),
623 constraintExprData_unaryExprGetExpr (expr2->data)
628 if (constraintExprData_binaryExprGetOp (expr1->data) != constraintExprData_binaryExprGetOp (expr2->data) )
631 if (! constraintExpr_same (constraintExprData_binaryExprGetExpr1 (expr1->data),
632 constraintExprData_binaryExprGetExpr1 (expr2->data)) )
635 if (! constraintExpr_same (constraintExprData_binaryExprGetExpr2 (expr1->data),
636 constraintExprData_binaryExprGetExpr2 (expr2->data)) )
651 bool constraintExpr_search (constraintExpr c, constraintExpr old)
654 constraintExprKind kind;
657 if ( constraintExpr_similar (c, old) )
660 DPRINTF((message ("Found %s",
661 constraintExpr_unparse(old)
673 temp = constraintExprData_unaryExprGetExpr (c->data);
674 ret = ret || constraintExpr_search (temp, old);
678 temp = constraintExprData_binaryExprGetExpr1 (c->data);
679 ret = ret || constraintExpr_search(temp, old);
681 temp = constraintExprData_binaryExprGetExpr2 (c->data);
682 ret = ret || constraintExpr_search(temp, old);
692 constraintExpr constraintExpr_searchandreplace (constraintExpr c, constraintExpr old, constraintExpr new )
694 constraintExprKind kind;
697 if ( constraintExpr_similar (c, old) )
700 BPRINTF((message ("Replacing %s with %s",
701 constraintExpr_unparse(old), constraintExpr_unparse(new)
703 return constraintExpr_copy (new);
713 temp = constraintExprData_unaryExprGetExpr (c->data);
714 temp = constraintExpr_searchandreplace (temp, old, new);
715 c->data = constraintExprData_unaryExprSetExpr (c->data, temp);
719 temp = constraintExprData_binaryExprGetExpr1 (c->data);
720 temp = constraintExpr_searchandreplace (temp, old, new);
721 c->data = constraintExprData_binaryExprSetExpr1 (c->data, temp);
723 temp = constraintExprData_binaryExprGetExpr2 (c->data);
724 temp = constraintExpr_searchandreplace (temp, old, new);
725 c->data = constraintExprData_binaryExprSetExpr2 (c->data, temp);
734 constraintExpr constraintExpr_simplifyChildren (constraintExpr c)
736 constraintExprKind kind;
746 temp = constraintExprData_unaryExprGetExpr (c->data);
747 temp = constraintExpr_simplify (temp);
748 c->data = constraintExprData_unaryExprSetExpr (c->data, temp);
751 BPRINTF((message("constraintExpr_simplfiyChildren: simplify binary expression: %s",constraintExpr_unparse(c) ) ) );
752 temp = constraintExprData_binaryExprGetExpr1 (c->data);
753 temp = constraintExpr_simplify (temp);
755 c->data = constraintExprData_binaryExprSetExpr1 (c->data, temp);
757 temp = constraintExprData_binaryExprGetExpr2 (c->data);
758 temp = constraintExpr_simplify (temp);
760 c->data = constraintExprData_binaryExprSetExpr2 (c->data, temp);
770 constraintExpr constraintExpr_setFileloc (constraintExpr c, fileloc loc)
780 t = constraintExprData_termGetTerm (c->data);
781 t = constraintTerm_setFileloc (t, loc);
782 c->data = constraintExprData_termSetTerm (c->data, t);
786 temp = constraintExprData_binaryExprGetExpr1 (c->data);
787 temp = constraintExpr_setFileloc (temp, loc);
788 c->data = constraintExprData_binaryExprSetExpr1 (c->data, temp);
790 temp = constraintExprData_binaryExprGetExpr2 (c->data);
791 temp = constraintExpr_setFileloc (temp, loc);
792 c->data = constraintExprData_binaryExprSetExpr2 (c->data, temp);
795 temp = constraintExprData_unaryExprGetExpr (c->data);
796 temp = constraintExpr_setFileloc (temp, loc);
797 c->data = constraintExprData_unaryExprSetExpr (c->data, temp);
803 constraintExpr constraintExpr_simplifybinaryExpr (constraintExpr c)
805 constraintExpr e1, e2;
807 e1 = constraintExprData_binaryExprGetExpr1 (c->data);
808 e2 = constraintExprData_binaryExprGetExpr2 (c->data);
810 if (constraintExpr_canGetValue (e1) && constraintExpr_canGetValue(e2) )
814 i = constraintExpr_getValue(e1) + constraintExpr_getValue (e2);
816 c = constraintExpr_makeIntLiteral (i);
823 constraintExpr constraintExpr_subtractExpr (constraintExpr expr, constraintExpr addent)
827 BPRINTF ( (message ("Doing subtraceTerm simplification") ) );
829 new = constraintExpr_makeBinaryOpConstraintExpr (expr, addent);
830 new->data = constraintExprData_binaryExprSetOp (new->data, MINUS);
834 constraintExpr constraintExpr_addExpr (constraintExpr expr, constraintExpr addent)
838 BPRINTF ( (message ("Doing addTerm simplification") ) );
840 new = constraintExpr_makeBinaryOpConstraintExpr (expr, addent);
841 new->data = constraintExprData_binaryExprSetOp (new->data, PLUS);
845 constraintExpr constraintExpr_solveBinaryExpr (constraintExpr lexpr, constraintExpr expr)
847 constraintExpr expr1, expr2;
848 constraintExprBinaryOpKind op;
850 if (lexpr->kind != binaryexpr)
853 expr2 = constraintExprData_binaryExprGetExpr2 (lexpr->data);
854 expr1 = constraintExprData_binaryExprGetExpr1 (lexpr->data);
855 op = constraintExprData_binaryExprGetOp (lexpr->data);
858 // if (constraintExpr_canGetValue (expr2) )
860 #warning make sure this works
862 lexpr->kind = expr1->kind;
863 lexpr->data = constraintExprData_copy (expr1->data, expr1->kind);
867 expr = constraintExpr_subtractExpr (expr, expr2);
869 expr = constraintExpr_addExpr (expr, expr2);
873 expr = constraintExpr_solveBinaryExpr (expr1, expr);
875 expr = constraintExpr_solveBinaryExpr (expr2, expr);
879 constraintExpr constraintExpr_simplifyunaryExpr (constraintExpr c)
883 llassert (c->kind == unaryExpr);
885 BPRINTF ( (message ("Doing constraintExpr_simplifyunaryExpr:%s", constraintExpr_unparse (c) ) ) );
887 if ( (constraintExprData_unaryExprGetOp (c->data) != MAXSET) &&
888 (constraintExprData_unaryExprGetOp (c->data) != MAXREAD) )
892 // pattern mxr ( var + const) = mxr(var) - const
894 exp = constraintExprData_unaryExprGetExpr (c->data);
896 if (exp->kind == term)
898 constraintTerm cterm;
900 cterm = constraintExprData_termGetTerm (exp->data);
902 if (constraintTerm_isStringLiteral(cterm) )
905 val = constraintTerm_getStringLiteral (cterm);
906 if (constraintExprData_unaryExprGetOp (c->data) == MAXSET)
908 return constraintExpr_makeIntLiteral (strlen (val) );
910 if (constraintExprData_unaryExprGetOp (c->data) == MAXREAD)
912 return constraintExpr_makeIntLiteral (strlen (val) );
919 if (exp->kind != binaryexpr)
922 if (constraintExprData_binaryExprGetOp (exp->data) == PLUS )
925 // if (constraintExpr_canGetValue (constraintExprData_binaryExprGetExpr2 (exp->data) ) )
928 constraintExpr temp, temp2, new;
930 DPRINTF ( (message ("Doing fancy simplification") ) );
932 temp = constraintExprData_binaryExprGetExpr2 (exp->data);
934 temp2 = constraintExprData_binaryExprGetExpr1 (exp->data);
935 c->data = constraintExprData_unaryExprSetExpr (c->data, temp2);
939 new = constraintExpr_subtractExpr (c, temp);
941 DPRINTF ( (message ("Done fancy simplification:%s", constraintExpr_unparse (new) ) ) );
947 DPRINTF ( (message ("Done simplification:%s", constraintExpr_unparse (c) ) ) );
952 constraintExpr constraintExpr_simplify (constraintExpr c)
954 constraintExprKind kind;
958 BPRINTF ( (message ("Doing constraintExpr_simplify:%s", constraintExpr_unparse (c) ) ) );
960 c = constraintExpr_simplifyChildren (c);
961 c = constraintExpr_combineConstants (c);
962 c = constraintExpr_simplifyChildren (c);
969 t = constraintExprData_termGetTerm (c->data);
970 t = constraintTerm_simplify (t);
971 c->data = constraintExprData_termSetTerm (c->data, t);
974 c = constraintExpr_simplifyunaryExpr (c);
977 c = constraintExpr_simplifybinaryExpr (c);
986 cstring constraintExpr_unparse (constraintExpr ex)
989 constraintExprKind kind;
991 llassert (ex != NULL);
998 st = message ("(%s) ", constraintTerm_print (constraintExprData_termGetTerm(ex->data) ) );
1001 st = message ("%s (%s)",
1002 constraintExprUnaryOpKind_print (constraintExprData_unaryExprGetOp (ex->data)
1004 constraintExpr_unparse (constraintExprData_unaryExprGetExpr (ex->data) )
1008 st = message ("(%s) %s (%s)",
1009 constraintExpr_unparse (constraintExprData_binaryExprGetExpr1 (ex->data) ),
1010 constraintExprBinaryOpKind_print (constraintExprData_binaryExprGetOp (ex->data)
1012 constraintExpr_unparse (constraintExprData_binaryExprGetExpr2 (ex->data) )
1017 st = message ("error");
1021 DPRINTF((message ("constraintExpr_unparse: '%s'",st) ) );
1025 constraintExpr constraintExpr_doSRefFixBaseParam (/*@returned@*/ constraintExpr expr, exprNodeList arglist)
1027 constraintTerm Term;
1028 constraintExprKind kind;
1029 constraintExpr expr1, expr2;
1030 constraintExprData data;
1031 llassert (expr != NULL);
1040 Term = constraintExprData_termGetTerm(data);
1041 Term = constraintTerm_doSRefFixBaseParam (Term, arglist);
1042 data = constraintExprData_termSetTerm(data, Term);
1045 expr1 = constraintExprData_unaryExprGetExpr (data);
1046 expr1 = constraintExpr_doSRefFixBaseParam (expr1, arglist);
1047 data = constraintExprData_unaryExprSetExpr (data, expr1);
1050 expr1 = constraintExprData_binaryExprGetExpr1 (data);
1051 expr2 = constraintExprData_binaryExprGetExpr2 (data);
1053 expr1 = constraintExpr_doSRefFixBaseParam (expr1, arglist);
1054 data = constraintExprData_binaryExprSetExpr1 (data, expr1);
1055 expr2 = constraintExpr_doSRefFixBaseParam (expr2, arglist);
1056 data = constraintExprData_binaryExprSetExpr2 (data, expr2);
1066 constraintExpr constraintExpr_doSRefFixConstraintParam (/*@returned@*/ constraintExpr expr, exprNodeList arglist)
1068 constraintExprKind kind;
1069 constraintExpr expr1, expr2;
1070 constraintExprData data;
1071 llassert (expr != NULL);
1080 expr = constraintTerm_doSRefFixConstraintParam (expr, arglist);
1083 expr1 = constraintExprData_unaryExprGetExpr (data);
1084 expr1 = constraintExpr_doSRefFixConstraintParam (expr1, arglist);
1085 data = constraintExprData_unaryExprSetExpr (data, expr1);
1088 expr1 = constraintExprData_binaryExprGetExpr1 (data);
1089 expr2 = constraintExprData_binaryExprGetExpr2 (data);
1091 expr1 = constraintExpr_doSRefFixConstraintParam (expr1, arglist);
1092 data = constraintExprData_binaryExprSetExpr1 (data, expr1);
1093 expr2 = constraintExpr_doSRefFixConstraintParam (expr2, arglist);
1094 data = constraintExprData_binaryExprSetExpr2 (data, expr2);
1104 constraintExpr constraintExpr_doFixResult (/*@returned@*/ constraintExpr expr, exprNode fcnCall)
1106 constraintExprKind kind;
1107 constraintExpr expr1, expr2;
1108 constraintExprData data;
1109 llassert (expr != NULL);
1118 expr = constraintTerm_doFixResult (expr, fcnCall);
1121 expr1 = constraintExprData_unaryExprGetExpr (data);
1122 expr1 = constraintExpr_doFixResult (expr1, fcnCall);
1123 data = constraintExprData_unaryExprSetExpr (data, expr1);
1126 expr1 = constraintExprData_binaryExprGetExpr1 (data);
1127 expr2 = constraintExprData_binaryExprGetExpr2 (data);
1129 expr1 = constraintExpr_doFixResult (expr1, fcnCall);
1130 data = constraintExprData_binaryExprSetExpr1 (data, expr1);
1131 expr2 = constraintExpr_doFixResult (expr2, fcnCall);
1132 data = constraintExprData_binaryExprSetExpr2 (data, expr2);
1142 cstring constraintExpr_print (constraintExpr expr)
1144 return constraintExpr_unparse(expr);
1147 bool constraintExpr_hasMaxSet (constraintExpr expr)
1151 t = constraintExpr_unparse(expr);
1153 return (strstr (t, "MAXSET") );
1158 /*returns 1 0 -1 like strcmp
1163 int constraintExpr_compare (constraintExpr expr1, constraintExpr expr2)
1167 if (constraintExpr_similar (expr1, expr2) )
1171 value1 = constraintExpr_getValue(expr1);
1172 value2 = constraintExpr_getValue(expr2);
1174 if (value1 > value2)
1177 if (value1 == value2)
1184 int constraintExpr_getValue (constraintExpr expr)
1186 llassert (expr->kind == term);
1187 return (constraintTerm_getValue (constraintExprData_termGetTerm (expr->data) ) );
1190 bool constraintExpr_canGetValue (constraintExpr expr)
1195 return constraintTerm_canGetValue (constraintExprData_termGetTerm (expr->data) );
1203 bool constraintExpr_canCompare (constraintExpr expr1, constraintExpr expr2)
1206 llassert(expr1 && expr2);
1207 return ( constraintExpr_canGetValue(expr1) &&
1208 constraintExpr_canGetValue(expr2)
1213 fileloc constraintExpr_getFileloc (constraintExpr expr)
1217 constraintExprKind kind;
1224 t = constraintExprData_termGetTerm (expr->data);
1225 return (constraintTerm_getFileloc (t) );
1228 e = constraintExprData_unaryExprGetExpr (expr->data);
1229 return (constraintExpr_getFileloc (e) );
1232 e = constraintExprData_binaryExprGetExpr1 (expr->data);
1233 return (constraintExpr_getFileloc (e) );
1236 // llfatalbug("Code should be reached");
1237 return (fileloc_undefined);
1242 /* bool constraintExpr_includesTerm (constraintExpr expr, constraintTerm term) */
1244 /* if (constraintTerm_hasTerm (expr->term, term) ) */
1247 /* if ( (expr->expr) != NULL) */
1249 /* return ( constraintExpr_includesTerm (expr->expr, term) ); */