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