1 #ifndef lint
2 static char *sccsid ="simul.c (CWI) 1.1 85/03/01";
3 #endif
4 #include "ideal.h"
5
6
depadd(dlistone,coeffone,dlisttwo,coefftwo)7 DEPPTR depadd(dlistone, coeffone, dlisttwo, coefftwo)
8 DEPPTR dlistone;
9 float coeffone;
10 DEPPTR dlisttwo;
11 float coefftwo;
12 {
13 /* produce a dependency list = coeffone*dlistone + coefftwo*dlisttwo */
14 register DEPPTR onewalk, twowalk, newhead, newwalk, prevnew;
15 DEPNODE nuhead;
16 prevnew = &nuhead;
17 prevnew->next = NULL;
18 onewalk = dlistone;
19 twowalk = dlisttwo;
20 while ((onewalk != NULL) || (twowalk != NULL)) {
21 if (onewalk != NULL)
22 if (twowalk != NULL)
23 if (onewalk->var > twowalk ->var) {
24 newwalk = depgen (
25 onewalk->var,
26 coeffone*onewalk->coeff
27 );
28 onewalk = onewalk->next;
29 }
30 else
31 if (onewalk->var == twowalk->var) {
32 newwalk = depgen (
33 onewalk->var,
34 coeffone*onewalk->coeff
35 + coefftwo*twowalk->coeff
36 );
37 onewalk = onewalk->next;
38 twowalk = twowalk->next;
39 }
40 else {
41 newwalk = depgen (
42 twowalk->var,
43 coefftwo*twowalk->coeff
44 );
45 twowalk = twowalk->next;
46 }
47 else {
48 newwalk = depgen (
49 onewalk->var,
50 coeffone*onewalk->coeff
51 );
52 onewalk = onewalk->next;
53 }
54 else {
55 newwalk = depgen (
56 twowalk->var,
57 coefftwo*twowalk->coeff
58 );
59 twowalk = twowalk->next;
60 }
61 if (fabs(newwalk->coeff) > EPSILON) {
62 prevnew->next = newwalk;
63 prevnew = newwalk;
64 } else
65 depfree (newwalk);
66 }
67 newhead = nuhead.next;
68 if (newhead != NULL) {
69 if (dbg) {
70 depprint (newhead);
71 fprintf (stderr, "\n");
72 }
73 return(newhead);
74 }
75 else {
76 dprintf "empty dep rep\n");
77 return (depgen ((VARPTR) NULL, 0.0));
78 }
79 }
80
depsubst(depinto,depfrom,depwho)81 DEPPTR depsubst(depinto, depfrom, depwho)
82 /* substitutes depfrom for depwho in depinto
83 /* WARNING: if depinto actually contains depfrom,
84 /* depinto is replaced */
85 DEPPTR depinto,
86 depfrom;
87 VARPTR depwho;
88 {
89 DEPPTR intowalker, intoparent, temp;
90 for (intowalker = depinto;
91 intowalker != NULL;
92 intowalker = intowalker->next)
93 if (intowalker->var == depwho)
94 break;
95 else
96 intoparent = intowalker;
97 if (intowalker == NULL)
98 return(depinto);
99 if (intowalker == depinto)
100 depinto = depinto->next;
101 else
102 intoparent->next = intowalker->next;
103 dprintf "Variable substitution proceeding\n");
104 temp = depadd(depinto, 1.0, depfrom, intowalker->coeff);
105 depfree (depinto);
106 tryfree(intowalker);
107 depinto = temp;
108 return (temp);
109 }
110