6 # include <ctype.h> /* for isdigit */
7 # include "lclintMacros.nf"
10 # include "cgrammar_tokens.h"
12 # include "exprChecks.h"
13 # include "aliasChecks.h"
14 # include "exprNodeSList.h"
15 # include "exprData.i"
18 int constraintExpr_getValue (constraintExpr expr)
20 if (expr->expr != NULL)
22 TPRINTF( ( "Not Implemented" ));
25 return (constraintTerm_getValue (expr->term) );
28 // returns 1 0 -1 like strcopy
29 int constraintExpr_compare (constraintExpr expr1, constraintExpr expr2)
33 value1 = constraintExpr_getValue(expr1);
34 value2 = constraintExpr_getValue(expr2);
46 bool constraintExpr_canCompare (constraintExpr expr1, constraintExpr expr2)
48 if (expr1->expr != NULL)
53 if (expr2->expr != NULL)
61 bool rangeCheck (arithType ar1, constraintExpr expr1, arithType ar2, constraintExpr expr2)
68 /*irst constraint is > only > => or == cosntraint can satify it */
69 if ( (ar2 == GT) || (ar2 == GTE) || (ar2 == EQ) )
71 if (! constraintExpr_canCompare (expr1, expr2) )
74 if (constraintExpr_compare (expr2, expr1) >= 0)
80 TPRINTF(("case not handled"));
85 /*returns true if cosntraint post satifies cosntriant pre */
86 bool satifies (constraint pre, constraint post)
88 if (!constraintTerm_same(pre->lexpr->term, post->lexpr->term) )
92 if (post->expr->expr == NULL)
94 return rangeCheck (pre->ar, pre->expr, post->ar, post->expr);
99 constraintExpr constraintExpr_simplify (constraintExpr expr)
102 expr->term = constraintTerm_simplify (expr->term);
103 if (expr->expr == NULL)
106 expr->expr = constraintExpr_simplify (expr->expr);
107 if ( (expr->term->constrType == INTLITERAL) && (expr->expr->term->constrType == INTLITERAL) )
109 TPRINTF( ("EVENTUAL IMPLEMENTATION OF LITERAL MERGE " ));
111 TPRINTF ( (message ("Expression is %s ", constraintExpr_print (expr) ) ) );
113 if (expr->op == PLUS )
115 TPRINTF( (message ("Adding %d and %d ", expr->term->value.intlit,
116 expr->expr->term->value.intlit) ) );
117 expr->term->value.intlit += expr->expr->term->value.intlit;
119 else if (expr->op == MINUS )
121 expr->term->value.intlit -= expr->expr->term->value.intlit;
123 expr->op = expr->expr->op;
125 expr->expr = expr->expr->expr;
131 constraintExpr constraintExpr_add (constraintExpr e, constraintTerm term, constraintExprOp op)
136 while (p->expr != NULL)
142 p->expr = constraintExpr_alloc();
143 p->expr->term = term;
148 constraintExpr termMove (constraintExpr dst, constraintExpr src)
151 llassert (src->expr != NULL);
152 term = src->expr->term;
154 dst = constraintExpr_add (dst, term, MINUS);
156 if (src->op == MINUS)
157 dst = constraintExpr_add (dst, term, PLUS);
162 constraint solveforterm (constraint c)
166 while (p->expr != NULL)
168 TPRINTF( (message("Moving %s", constraintExpr_print (c->expr) ) ) );
169 c->expr = termMove(c->expr, p);
173 p->expr = p->expr->expr;
178 constraint constraint_simplify (constraint c)
180 c = solveforterm (c);
181 c->lexpr = constraintExpr_simplify (c->lexpr);
182 c->expr = constraintExpr_simplify (c->expr);
186 bool resolve (constraint c, constraintList p)
188 constraintList_elements (p, el)
190 if ( satifies (c, el) )
192 TPRINTF ( (message ("\n%s Satifies %s\n ", constraint_print(el), constraint_print(c) ) ) );
196 end_constraintList_elements;
197 TPRINTF ( (message ("no constraints satify %s", constraint_print(c) ) ));
201 constraint substitute (constraint c, constraintList p)
203 constraintList_elements (p, el)
205 if (constraintTerm_same(c->lexpr->term, el->lexpr->term) )
209 c->lexpr = constraintExpr_copy (el->expr);
210 c = constraint_simplify(c);
215 end_constraintList_elements;
217 c = constraint_simplify(c);
222 constraintList reflectChanges (constraintList pre2, constraintList post1)
227 ret = constraintList_new();
228 constraintList_elements (pre2, el)
230 if (!resolve (el, post1) )
232 temp = substitute (el, post1);
233 ret = constraintList_add (ret, temp);
235 } end_constraintList_elements;
241 /*check if rvalue side has term*/
242 bool constraintExpr_hasTerm (constraint c, constraintTerm term)
248 if (constraintTerm_same (p->term, term) )
254 message ("constraintExpr_hasTerm returned fallse for %s %S",
255 constraint_print(c), constraintTerm_print(term)
261 constraintExpr solveEq (constraint c, constraintTerm t)
264 c = constraint_copy (c);
265 TPRINTF(("\ndoing solveEq\n"));
266 if (! constraintTerm_same (c->expr->term, t) )
268 TPRINTF ( (message ("\n\nconstraintTerms: %s %s not same ", constraintTerm_print(c->expr->term),
269 constraintTerm_print(t) )
275 while (p->expr != NULL)
277 TPRINTF( (message("\n\nMoving %s", constraintExpr_print (c->expr) ) ) );
278 c->lexpr = termMove(c->lexpr, p);
279 p->expr = p->expr->expr;
286 constraint updateConstraint (constraint c, constraintList p)
288 TPRINTF(("start updateConstraints"));
289 constraintList_elements (p, el)
292 if (constraintTerm_same(c->lexpr->term, el->lexpr->term) )
299 if (constraintExpr_hasTerm (el, c->lexpr->term) )
301 constraintExpr solve;
303 solve = solveEq (el, c->lexpr->term);
306 c->lexpr = constraintExpr_copy (solve);
307 c = constraint_simplify(c);
314 end_constraintList_elements;
315 c = constraint_simplify(c);
317 TPRINTF(("end updateConstraints"));
322 constraintList reflectChangesEnsures (constraintList pre2, constraintList post1)
326 ret = constraintList_new();
327 constraintList_elements (pre2, el)
329 if (!resolve (el, post1) )
331 temp = updateConstraint (el, post1);
333 ret = constraintList_add (ret, temp);
335 } end_constraintList_elements;
340 void mergeResolve (exprNode parent, exprNode child1, exprNode child2)
343 TPRINTF( (message ("magically merging constraint into parent:%s for children: %s and %s", exprNode_unparse (parent), exprNode_unparse (child1), exprNode_unparse(child2) )
345 llassert (!exprNode_isError (child1) || !exprNode_isError(child2) );
346 if (exprNode_isError (child1) )
348 parent->requiresConstraints = constraintList_copy (child2->requiresConstraints);
349 parent->ensuresConstraints = constraintList_copy (child2->ensuresConstraints);
350 DPRINTF((message ("Copied child constraints: pre: %s and post: %s ",
351 constraintList_print( child2->requiresConstraints),
352 constraintList_print (child2->ensuresConstraints)
358 llassert(!exprNode_isError(child2) );
360 TPRINTF( (message ("Child constraints are %s and %s ",
361 constraintList_print (child1->requiresConstraints),
362 constraintList_print (child2->requiresConstraints)
365 parent->requiresConstraints = constraintList_new();
366 parent->ensuresConstraints = constraintList_new();
368 parent->requiresConstraints = constraintList_copy (child1->requiresConstraints);
370 temp = reflectChanges (child2->requiresConstraints, child1->ensuresConstraints);
371 parent->requiresConstraints = constraintList_addList (parent->requiresConstraints, temp);
374 temp = reflectChangesEnsures (child1->ensuresConstraints, child2->ensuresConstraints);
375 // temp = constraintList_copy (child1->ensuresConstraints);
378 parent->ensuresConstraints = constraintList_copy (child2->ensuresConstraints);
379 parent->ensuresConstraints = constraintList_addList (parent->ensuresConstraints, temp);
381 TPRINTF( (message ("Parent constraints are %s and %s ",
382 constraintList_print (parent->requiresConstraints),
383 constraintList_print (parent->ensuresConstraints)