perm filename SIM.SAI[CMU,AIL] blob sn#126739 filedate 1974-10-25 generic text, type T, neo UTF8
00100	BEGIN "SIM"
00200	
00300	DEFINE ! ="COMMENT";
00400	INTEGER CNTR;
00500	INTEGER COUNT,BR,EOF,COUNT1,BR1,EOF1,FLAG;
00600	INTEGER PPRT,LPRT,REM,MR,TQ,NA,M,C,T;
00700	INTEGER PROC,D;
00800	INTEGER DACUM;
00900	STRING S1;
01000	REAL TM,TACUM,QBAR;
01100	INTEGER I,I1,I2;
01200	REAL R1,R2;
01300	DEFINE CHECK="TRUE";
01400	INTEGER STRATEGY;
01500	
01600	REAL PROCEDURE EXPONENTIAL(REAL F);
01700	BEGIN
01800	   RETURN(-1.0/F*LOG(RAN(0)))
01900	END;
02000	
02100	OPEN(1,"DSK",0,2,0,COUNT,BR,EOF);
02200	OPEN(2,"DSK",0,0,2,COUNT1,BR1,EOF1);
02300	OUTSTR("ID=");
02400	S1←INCHWL;
02500	OUTSTR("STRATEGY=");
02600	STRATEGY←CVD(INCHWL);
02700	LOOKUP(1,"SIMIN."&S1,FLAG);
02800	ENTER(2,"SIMOUT."&S1,FLAG);
02900	T←INTIN(1);
03000	C←INTIN(1);
03100	
03200	BEGIN "D1"
03300	REAL ARRAY F,FC,UC[1:C];
03400	FOR I←1 STEP 1 UNTIL C DO
03500	F[I]←REALIN(1);
03600	QBAR←0;
03700	FOR I←1 STEP 1 UNTIL C DO
03800	QBAR←QBAR+I*F[I];
03900	
04000	FOR M←1 DO
04100	BEGIN "D2"
04200	INTEGER ARRAY ALLOC,DMD,PRT[1:M];
04300	REAL ARRAY P[M:M*C];
04400	REAL ARRAY A[1:M];
04500	
04600	PROCEDURE INITIAL;
04700	
04800	BEGIN
04900	   PPRT←LPRT←REM←MR ←TQ←NA←TACUM←0;
05000	   ARRCLR(ALLOC);
05100	   ARRCLR(DMD);
05200	   ARRCLR(PRT);
05300	   ARRCLR(FC);
05400	   ARRCLR(UC);
05500	   ARRCLR(P);
05600	   ARRCLR(A);
05700	   I1←(T-C)/M MIN C;
05800	   FOR I2←1 STEP 1 UNTIL M DO
05900	   ALLOC[I2]←I1;
06000	   NA←M;
06100	   TQ←M*I1;
06200	   MR←C-I1;
06300	   REM←T-TQ;
06400	END;
06500	
06600	PROCEDURE NEWTRAN;
06700	
06800	BEGIN
06900	   INTEGER P;
07000	   TM←-1.0;
07100	   FOR I←1 STEP 1 UNTIL M DO
07200	   IF DMD[I]=0 THEN
07300	   BEGIN
07400	      R1←EXPONENTIAL(IF (P←ALLOC[I])=1 OR P=C THEN
07500	                     F[P] ELSE F[P]*2);
07600	      IF TM=-1.0 THEN
07700	      BEGIN
07800	         PROC←I;
07900	         TM←R1;
08000	      END ELSE
08100	      IF TM>R1 THEN
08200	      BEGIN
08300	         PROC←I;
08400	         TM←R1;
08500	      END
08600	   END;
08700	   IF RAN(0)>0.5 THEN D←1 ELSE D←-1;
08800	   DACUM←DACUM+D;
08900	   IF ALLOC[PROC]=1 THEN D←1 ELSE
09000	   IF ALLOC[PROC]=C THEN D←-1;
09100	END;
09200	
09300	PROCEDURE UPDATE;
09400	
09500	BEGIN
09600	   FOR I←1 STEP 1 UNTIL M DO
09700	   IF DMD[I]=0 THEN
09800	   FC[ALLOC[I]]←FC[ALLOC[I]]+TM ELSE
09900	   UC[ALLOC[I]+1]←UC[ALLOC[I]+1]+TM;
10000	   P[TQ]←P[TQ]+TM;
10100	   A[NA]←A[NA]+TM;
10200	   TACUM←TACUM+TM;
10300	END;
10400	
10500	PROCEDURE NEWSYS;
10600	BEGIN
10700	   CASE STRATEGY OF
10800	   BEGIN
10900	
11000	   ! 0: FIFO;
11100	   BEGIN
11200	      IF D=1 THEN
11300	      BEGIN
11400	         IF MR<REM OR C-ALLOC[PROC]=REM  THEN
11500	         ALLOC[PROC]←ALLOC[PROC]+1 ELSE
11600	         BEGIN
11700	            DMD[PROC]←1;
11800	            IF PPRT=0 THEN LPRT←PPRT←PROC ELSE
11900	            BEGIN
12000	               PRT[LPRT]←PROC;
12100	               LPRT←PROC;
12200	            END;
12300	            PRT[PROC]←0;
12400	         END
12500	      END ELSE
12600	      BEGIN
12700	         INTEGER P,PO;
12800	         ALLOC[PROC]←ALLOC[PROC]-1;
12900	         IF PPRT≠0 THEN
13000	         BEGIN
13100	            MR←0;
13200	            FOR I←1 STEP 1 UNTIL M DO
13300	            IF ALLOC[I]>MR THEN MR←ALLOC[I];
13400	            MR←C-MR;
13500	            IF MR≤REM THEN
13600	            BEGIN
13700	               ALLOC[PPRT]←ALLOC[PPRT]+1;
13800	               DMD[PPRT]←0;
13900	               PPRT←PRT[PPRT];
14000	            END  ELSE
14100	            BEGIN
14200	               P←PPRT;
14300	               WHILE P≠0 DO
14400	               IF C-ALLOC[P]=MR THEN
14500	               BEGIN
14600	                  ALLOC[P]←ALLOC[P]+1;
14700	                  DMD[P]←0;
14800	                  IF P=PPRT THEN PPRT←PRT[PPRT] ELSE
14900	                  PRT[PO]←PRT[P];
15000	                  DONE
15100	               END ELSE
15200	               BEGIN
15300	                  PO←P;
15400	                  P←PRT[P]
15500	               END
15600	            END
15700	         END
15800	      END
15900	   END;
16000	
16100	   ! 1: SMALLEST A FIRST;
16200	
16300	   BEGIN
16400	      IF D=1 THEN
16500	      BEGIN
16600	         IF MR<REM OR C-ALLOC[PROC]=REM THEN
16700	         ALLOC[PROC]←ALLOC[PROC]+1 ELSE DMD[PROC]←1;
16800	      END ELSE
16900	      BEGIN
17000	         ALLOC[PROC]←ALLOC[PROC]-1;
17100	         MR←0;
17200	         FOR I←1 STEP 1 UNTIL M DO
17300	         IF MR<ALLOC[I] THEN MR←ALLOC[I];
17400	         MR←C-MR;
17500	         IF MR≤REM THEN
17600	         BEGIN
17700	            I1←C;I2←0;
17800	            FOR I←1 STEP 1 UNTIL M DO
17900	            IF DMD[I]=1 AND ALLOC[I]<I1 THEN
18000	            BEGIN
18100	               I1←ALLOC[I];
18200	               I2←I;
18300	            END;
18400	            IF I2≠0 THEN
18500	            BEGIN
18600	               ALLOC[I2]←ALLOC[I2]+1;
18700	               DMD[I2]←0;
18800	            END;
18900	         END ELSE
19000	         BEGIN
19100	            I1←C;
19200	            I2←0;
19300	            FOR I←1 STEP 1 UNTIL M DO
19400	            IF C-ALLOC[I]=MR AND DMD[I]=1 AND ALLOC[I]<I1 THEN
19500	            BEGIN
19600	               I1←ALLOC[I];
19700	               I2←I;
19800	            END;
19900	            IF I2≠0 THEN
20000	            BEGIN
20100	               ALLOC[I2]←ALLOC[I2]+1;
20200	               DMD[I2]←0;
20300	            END;
20400	         END
20500	      END
20600	   END
20700	   END;
20800	   REM←T;
20900	   MR←C;
21000	   TQ←0;
21100	   NA←0;
21200	   FOR I←1 STEP 1 UNTIL M DO
21300	   BEGIN
21400	      REM←REM-ALLOC[I];
21500	      IF C-ALLOC[I]<MR THEN
21600	      MR←C-ALLOC[I];
21700	      TQ←TQ+ALLOC[I]+DMD[I];
21800	      NA←NA+1-DMD[I];
21900	   END;
22000	END;
22100	
22200	PROCEDURE DATOUT;
22300	
22400	BEGIN
22500	   R1←R2←0;
22600	   FOR I←1 STEP 1 UNTIL C DO
22700	   BEGIN
22800	      R1←R1+FC[I];
22900	      R2←R2+UC[I];
23000	   END;
23100	   FOR I←1 STEP 1 UNTIL C DO
23200	   BEGIN
23300	      FC[I]←FC[I]/R1;
23400	      UC[I]←UC[I]/R2;
23500	   END;
23600	   FOR I←M STEP 1 UNTIL M*C DO
23700	   P[I]←P[I]/TACUM;
23800	   FOR I←1 STEP 1 UNTIL M DO
23900	   A[I]←A[I]/TACUM;
24000	   SETFORMAT(4,0);
24100	   OUT(2,"M="&CVS(M)&"  ");
24200	   R1←0;
24300	   FOR I←1 STEP 1 UNTIL M DO
24400	   R1←R1+I*A[I];
24500	   SETFORMAT(14,7);
24600	   OUT(2,"ABAR="&CVF(R1)&'15&'12&'12);
24700	   IF NOT CHECK THEN RETURN;
24800	   OUT(2,"DACUM="&CVS(DACUM)&'15&'12&'12);
24900	   OUT(2,"       F[1:C]      FC[1:C]=      UC[1:C]=      P[M:MC]=      A[1:M]="&'15&'12&'12);
25000	   I1←M*C-M+1;
25100	   FOR I←1 STEP 1 UNTIL C DO
25200	   BEGIN
25300	      IF I≤C THEN OUT(2,CVF(F[I])&CVF(FC[I])&CVF(UC[I])) ELSE
25400	      OUT(2,"                                          ");
25500	      OUT(2,CVF(P[I+M-1]));
25600	      IF I≤M THEN OUT(2,CVF(A[I]));
25700	      OUT(2,'15&'12);
25800	   END;
25900	   OUT(2,'15&'12&'12&'12);
26000	END;
26100	
26200	RAN(300301);
26300	INITIAL;
26400	FOR CNTR←1 STEP 1 UNTIL 50 DO
26500	BEGIN
26600	   NEWTRAN;
26700	   UPDATE;
26800	   NEWSYS;
26900	END;
27000	DATOUT;
27100	END "D2";
27200	END "D1";
27300	CLOSE(1);
27400	CLOSE(2);
27500	END "SIM"