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