CTITLECSTRAM -- TRACE ARRAY MANAGEMENT 00000100 C*********************************************************************** C COPYRIGHT ATLANTIC RICHFIELD COMPANY 1991 * C*********************************************************************** CA AUTHOR R. MCMILLAN 00000200 CA DESIGNER G. HEYMAN/F. COLLINS 00000300 CA LANGUAGE VS FORTRAN 00000401 CA SYSTEM IBM AND CRAY 00000501 C WRITTEN 2-14-75 00000600 C REVISED 2-01-78 BY REM. MAKE TRACE LENGTH EQUAL A 00000700 C MIMIMUM OF 3664 SO READ CAN 00000800 C HANDLE HISTORY RECORDS. 00000900 C REVISED 12-05-84 BY RDK. DUAL PATH IBM/CRAY. 00001000 CA 00001100 CA 00001200 CA CALL CSTRAM 00001300 CA 00001400 CA 00001500 CA THIS ROUTINE SAVES AND KEEPS TRACK OF TRACES THAT ARE INPUT AND 00001600 CA OUTPUT FROM PROCESSES. IT ALSO SAVES TRACES AT NODES AND FINDS 00001700 CA THE CORRECT TRACE FOR EACH BRANCH. 00001800 C 00001900 C COMMON /P/ VARIABLES. 00002000 C 00002100 C IN KPNA 00002200 C IN KPRNO 00002300 C IN KPIBN 00002400 C IN/OUT KPITSV = INDEX OF TRACE ARRAY IN WHICH A TRACE WAS 00002500 C SAVED AT A NODE. 00002600 C OUT MCRTF 00002700 C IN MCIKPE 00002800 C IN MCNKP 00002900 C IN MCTAMF = FLAG SPECIFYING ACTION BY CSTRAM. 00003000 C IN/OUT MCI1 00003100 C OUT MCI2 00003200 C IN/OUT MCNTA 00003300 C IN MCNTAM 00003400 C OUT MCN12 00003500 C OUT MCN21 00003600 C IN/OUT MCTACS 00003700 C IN/OUT MCTANS 00003800 C IN/OUT MCTADD 00003900 C IN PTNCW 00004000 C IN PTTBLK 00004100 C IN PROTAB 00004200 C 00004300 C INTERNAL VARIABLES AND CONSTANTS. 00004400 C 00004500 C ALLOC = AMOUNT OF CORE ALLOCATED BY GETMAIN I4 00004600 C I = DO LOOP VARIABLE I4 00004700 C IPIPKE = INDEX TO THE FIRST WORD OF A PROTAB ENTRY I4 00004800 C CORRESPONDING TO A KP ARREA FOR A PROCESS 00004900 C IPITSV = INCREMENT IN PROTAB ENTRY TO GET INDEX OF I4 00005000 C SAVED TRACE ARRAY 00005100 C ITRASV = INDEX TO SAVED TRACE ARRAY I4 00005200 C LAST = INDEX OF LAST PROTAB ENTRY I4 00005300 C LEN = LENGTH REQUESTED FROM GETMAIN FOR TRACE I4 00005400 C ARRAYS. (LARGER OF PTTBLK AND MINLEN). 00005500 C MINLEN = MINIMUM LENGTH FOR TRACE ARRAYS (3664). I4 00005600 C 00005700 C EJECT 00005800 C FUNCTIONAL DESCRIPTION OF PROGRAM. 00005900 C 00006000 C THIS ROUTINE PERFORMS THE TRACE ARRAY MANAGEMENT TASK FOR 00006100 C SPARC. THE RULES WHICH FOLLOW SHOULD NOT BE CHANGED UNLESS 00006200 C THE CHANGES HAVE BEEN VERY VERY CAREFULLY TESTED. 00006300 C 00006400 C THE STATUS AND LOCATION OF TRACE ARRAY NUMBER I ARE SPECIFIED 00006500 C BY THE FOLLOWING VARIABLES: 00006600 C 00006700 C NAME DEFINITION 00006800 C 00006900 C MCTACS(I) CURRENT STATUS OF THE TRACE ARRAY. 00007000 C 0 = EMPTY (AVAILABLE) 00007100 C 1 = INPUT (SOURCE) 00007200 C 2 = OUTPUT (RESULT) 00007300 C 4 = HOLD (AT A NODE) 00007400 C 00007500 C MCTANS(I) NEXT STATUS OF THE TRACE ARRAY. 00007600 C 1 = INPUT (SOURCE) 00007700 C 2 = OUTPUT (RESULT) 00007800 C 4 = HOLD (AT A NODE) 00007900 C 00008000 C MCTADD(I) ADDRESS OF THE TRACE ARRAY. 00008100 C 00008200 C FOR CONVENIENCE THE SET OF THREE VALUES WILL BE ABBREVIATED 00008300 C 00008400 C (C,N,A) OR (C,N), 00008500 C 00008600 C WHERE 00008700 C 00008800 C C = MCTACS(I), 00008900 C 00009000 C N = MCTANS(I), 00009100 C 00009200 C A = MCTADD(I). 00009300 C 00009400 C IN ORDER TO CONVENIENTLY DEFINE THE FUNCTIONS OF THIS 00009500 C ROUTINE IT IS NECESSARY TO FORMULATE SOME LOGICAL OPERATIONS 00009600 C WHICH THE PROGRAM WILL PERFORM UPON THE TABLE. 00009700 C THE FIRST OPERATION IS THE SCAN OF ALL (C,N). A SCAN WILL 00009800 C CAUSE THE PROGRAM TO EXAMINE EACH (C,N) AND TAKE ACTION 00009900 C DEPENDING UPON THE VALUE OF (C,N). 00010000 C THE TEST OPERATION IS THE ONE WHICH EXAMINES COUNTERS OR 00010100 C FLAGS AND THUS DIRECTS THE FLOW OF THE ROUTINE. 00010200 C THE LAST OPERATION IS THE FIND OPERATION. IT IS PROVIDED 00010300 C IN ORDER THAT THE TRACE ARRAY WHICH CONTAINS A TRACE SAVED 00010400 C AFTER A NODE PROCESS CAN BE FOUND AND THE TRACE ARRAY BE 00010500 C USED AS INPUT TO THE PROCESSES FOLLOWING A NODE. 00010600 C EJECT 00010700 C IMPLEMENTATION SPECIFICATIONS. 00010800 C 00010900 C 00011000 C THE MAIN FUNCTION OF THIS PROGRAM IS TO PERFORM A SCAN OF 00011100 C THE (C,N), SWITCHING THEM TO (N,C) AND THUS YIELDING NEW 00011200 C (C,N). SELECTING THE APPROPRIATE (C,N) TO SWITCH IS 00011300 C SPECIFIED BY AN APPENDAGE TO THE SCAN OPERATION. 00011400 C THE METHOD OF SELECTING (C,N) FOR COUNTING IS ALSO 00011500 C APPENDED TO THE SCAN OPERATION. 00011600 C 00011700 C THE RULES FOR COMBINING SCANNING, TESTING AND 00011800 C FINDING OPERATIONS ARE: 00011900 C 00012000 C MCTAMF RULE DESCRIPTION 00012100 C 00012200 C MCTAMF = 1 SCAN ONE: FIRST (0,1) TO (1,2). 00012300 C INITIAL NEXT (0,1) TO (2,1). 00012400 C STOP SCAN. 00012500 C COUNT (0,1). 00012600 C TEST: COUNT OF (0,1) NE 2,ABORT.(MCRTF=-10)00012700 C ZERO: ZERO THE (1,2,A) TRACE ARRAY. 00012800 C ZERO THE (2,1,A) TRACE ARRAY. 00012900 C 00013000 C MCTAMF = 2 SCAN ONE: (1,N) TO (N,1). 00013100 C NORMAL (2,1) TO (1,2). 00013200 C COUNT (1,2) AND (2,1). 00013300 C TEST: COUNT OF (2,1) NE 1, ABORT. (-11) 00013400 C COUNT OF (1,2) EQ 1,FINISHED. 00013500 C COUNT OF (1,2) GT 1, ABORT. (-12) 00013600 C COUNT OF (1,2) EQ 0, START SCAN TWO. 00013700 C SCAN TWO: FIRST (0,1) TO (2,1). 00013800 C STOP SCAN. 00013900 C COUNT (0,1). 00014000 C TEST : COUNT OF (0,1) NE 1, ABORT. (-16) 00014100 C 00014200 C EJECT 00014300 C MCTAMF = 3 TEST : TRACE MCI2 .NE. (2,1), ABORT. (-13) 00014400 C NODE CHANGE TO (4,1) 00014500 C SET INDEX OF (4,1) INTO KPITSV OF /P/00014600 C 00014700 C MCTAMF = 4 SCAN ONE: (1,2) TO (0,1). 00014800 C BRANCH (2,1) TO (0,1). 00014900 C COUNT (1,2) AND (2,1). 00015000 C TEST : COUNT OF (1,2) .GT. 1, ABORT. (-12) 00015100 C COUNT OF (2,1) .GT. 1, ABORT. (-17) 00015200 C FIND : KPIBN POINTS TO NODE. INDEX INTO 00015300 C PROTAB FOR THE NODE IS 00015400 C IPIPKE = PTNCW*(KPIBN - 1). 00015500 C INDEX TO KPITSV IN A PROTAB ENTRY IS 00015600 C IPITSV = (LOC(KPITSV) - LOC(KPNA))/4 00015700 C + 1. 00015800 C TRACE ARRAY INDEX OF SAVED TRACE IS 00015900 C ITRASV = PROTAB(IPIPKE + IPITSV). 00016000 C IF ENTRY IS (4,1) CONVERT TO (1,4). 00016100 C TEST : ENTRY NOT (4,1) OR (1,4) ABORT (-15).00016200 C SCAN PROTAB: EXAMINE EACH KPNA AND KPRNO 00016300 C FROM THIS POINT DOWNWARDS LOOKING 00016400 C FOR A SET WHICH MATCH THE CURRENT 00016500 C VALUES IN /P/. 00016600 C COUNT MATCH. 00016700 C TEST : COUNT MATCH EQ 0, (1,4) TO (1,2). 00016800 C SCAN TWO: FIRST (0,1) TO (2,1). 00016900 C COUNT (0,1). 00017000 C TEST : COUNT OF (0,1) EQ 0, ABORT. (-16) 00017100 C 00017200 C MCTAMF = 5 SCAN ONE: TRACE ARRAY 1 TO (1,2). 00017300 C END TRACE ARRAY 2 TO (2,1). 00017400 C ALL OTHER TRACE ARRAYS TO (0,1). 00017500 C ZERO : ZERO THE (1,2,A) TRACE ARRAY. 00017600 C ZERO THE (2,1,A) TRACE ARRAY. 00017700 C 00017800 C MCTAMF = 6 00017900 C NO ACTION 00018000 C 00018100 C IN EACH CASE, THE INDICES OF THE INPUT AND OUTPUT ARRAYS 00018200 C FOR THE NEXT PROCESS ARE SAVED FOR USE BY THE CSCALL 00018300 C PROGRAM. 00018400 C INDEX OF THE INPUT OR (1,N) ARRAY IS PLACED IN MCI1, 00018500 C INDEX OF THE OUTPUT OR (2,N) ARRAY IS PLACED IN MCI2. 00018600 C EJECT 00018700 C 00018800 C ERRORS 00018900 C MCRTF=-10 NOT ENOUGH CORE FROM GETMAIN 00019000 C -11 NUMBER OF OUTPUT TRACE ARRAYS .NE. 1 00019100 C -12 NUMBER OF INPUT TRACE ARRAYS .GT. 1 00019200 C -13 TRACE ARRAY MCI2 AT A NODE IS NOT (2,1) 00019300 C -14 NUMBER OF INPUT TRACE ARRAYS .NE. 1 *NOT IN USE* 00019400 C -15 DID NOT FIND TRACE ARRAY IN HOLD STATUS 00019500 C -16 TOO MANY TRACE ARRAYS 00019600 C -17 NUMBER OF OUTPUT TRACE ARRAYS .GT. 1 00019700 C 00019800 SUBROUTINE CSTRAM 00019900 C 00020000 IMPLICIT INTEGER (A-Z) 00020100 C 00020200 C COMMON /P/ STATEMENTS GENERATED BY UTCGI4 11/23/83 00020300 COMMON /P/ STARTP ( 2) , M00000( 102) 00020400 CIBM REAL *8 STARTP 00020500 COMMON /P/ KPNA 00020600 COMMON /P/ KPRNO , M00420( 21) 00020700 COMMON /P/ KPIBN 00020800 COMMON /P/ KPITSV , M00512( 54) 00020900 COMMON /P/ MCRTF , M00732( 2) 00021000 COMMON /P/ MCIKPE 00021100 COMMON /P/ MCNKP , M00748( 2) 00021200 COMMON /P/ MCTAMF , M00760 00021300 COMMON /P/ MCI1 00021400 COMMON /P/ MCI2 , M00772( 4) 00021500 COMMON /P/ MCNTA 00021600 COMMON /P/ MCNTAM 00021700 COMMON /P/ MCN12 00021800 COMMON /P/ MCN21 00021900 COMMON /P/ MCTACS ( 20) 00022000 COMMON /P/ MCTANS ( 20) 00022100 COMMON /P/ MCTADD ( 20) , M00968( 60) 00022200 COMMON /P/ PTNCW 00022300 COMMON /P/ PTTBLK , M01292( 36) 00022400 COMMON /P/ PROTAB ( 2) 00022500 COMMON /P/ ENDP 00022600 C 00022700 COMMON /SYSTEM/ SYSTEM, SYBYPW, SYLOCF 00022800 C 00022900 C 00023000 C=================================================================== 00023100 C 00023200 C INTEGER VARIABLES - LOCAL 00023300 C 00023400 INTEGER MINLEN 00023500 DATA MINLEN /3664/ 00023600 C 00023700 C EJECT 00023800 MCRTF = 0 00023900 GO TO (100, 00024000 * 200, 00024100 * 300, 00024200 * 400, 00024300 * 500, 00024400 * 2000), 00024500 * MCTAMF 00024600 C 00024700 C INITIALIZE ONE TRACE ARRAY FOR INPUT AND ONE FOR OUTPUT 00024800 C 00024900 100 MCTACS(1) = 1 00025000 MCTANS(1) = 2 00025100 C SET LENGTH FOR GETMAIN 00025200 LEN = PTTBLK 00025300 IF (LEN .LT. MINLEN) LEN = MINLEN 00025400 CALL USGET (MCTADD(1), LEN, ALLOC) 00025500 IF (ALLOC .LT. LEN) GO TO 1000 00025600 MCTACS(2) = 2 00025700 MCTANS(2) = 1 00025800 CALL USGET (MCTADD(2), LEN, ALLOC) 00025900 IF (ALLOC .LT. LEN) GO TO 1000 00026000 MCNTA = MCNTA + 2 00026100 MCI1 = 1 00026200 MCI2 = 2 00026300 GO TO 2000 00026400 C 00026500 C NORMAL CASE 00026600 C 00026700 200 MCN12 = 0 00026800 MCN21 = 0 00026900 C 00027000 DO 230 00027100 * I = 1, MCNTA 00027200 IF (MCTACS(I) .NE. 1) GO TO 220 00027300 IF (MCTANS(I) .NE. 2) GO TO 210 00027400 MCN12 = MCN12 + 1 00027500 MCI2 = I 00027600 210 MCTACS(I) = MCTANS(I) 00027700 MCTANS(I) = 1 00027800 GO TO 230 00027900 220 IF (MCTACS(I).NE.2 .OR. MCTANS(I).NE.1) GO TO 230 00028000 MCTACS(I) = 1 00028100 MCTANS(I) = 2 00028200 MCN21 = MCN21 + 1 00028300 MCI1 = I 00028400 230 CONTINUE 00028500 C 00028600 IF (MCN21 .NE. 1) GO TO 1010 00028700 IF (MCN12 .EQ. 1) GO TO 2000 00028800 IF (MCN12 .GT. 1) GO TO 1020 00028900 C NO INPUT TRACE SO MAKE AN OUTPUT TRACE 00029000 C 00029100 DO 250 00029200 * I = 1, MCNTAM 00029300 IF (MCTACS(I).EQ.0 .AND. MCTANS(I).EQ.1) GO TO 260 00029400 250 CONTINUE 00029500 C 00029600 C ERROR - TOO MANY TRACE ARRAYS 00029700 MCRTF = -16 00029800 GO TO 2000 00029900 260 MCI2 = I 00030000 MCTACS(I) = 2 00030100 MCTANS(I) = 1 00030200 IF (MCTADD(I) .NE. 0) GO TO 270 00030300 CALL USGET (MCTADD(I), LEN, ALLOC) 00030400 IF (ALLOC .LT. LEN) GO TO 1000 00030500 MCNTA = MCNTA + 1 00030600 GO TO 2000 00030700 270 CALL USZERO (MCTADD(I), LEN) 00030800 GO TO 2000 00030900 C 00031000 C NODE 00031100 C 00031200 300 IF (MCTACS(MCI2).NE.2 .OR. MCTANS(MCI2).NE.1) GO TO 310 00031300 MCTACS(MCI2) = 4 00031400 KPITSV = MCI2 00031500 GO TO 2000 00031600 C ERROR - TRACE ARRAY MCI2 AT A NODE IS NOT (2,1) 00031700 310 MCRTF = -13 00031800 GO TO 2000 00031900 C 00032000 C BRANCH 00032100 C 00032200 400 MCN12 = 0 00032300 MCN21 = 0 00032400 C 00032500 DO 430 00032600 * I = 1, MCNTA 00032700 IF (MCTACS(I).NE.1 .OR. MCTANS(I).NE.2) GO TO 410 00032800 MCN12 = MCN12 + 1 00032900 GO TO 420 00033000 410 IF (MCTACS(I).NE.2 .OR. MCTANS(I).NE.1) GO TO 430 00033100 MCN21 = MCN21 + 1 00033200 420 MCTACS(I) = 0 00033300 MCTANS(I) = 1 00033400 430 CONTINUE 00033500 C 00033600 IF (MCN12 .GT. 1) GO TO 1020 00033700 IF (MCN21 .GT. 1) GO TO 1050 00033800 IPIPKE = PTNCW * (KPIBN-1) + 1 00033900 IPITSV = (LOC(KPITSV) - LOC(KPNA)) / SYLOCF 00034000 ITRASV = PROTAB(IPIPKE+IPITSV) 00034100 IF (MCTACS(ITRASV).EQ.1.AND.MCTANS(ITRASV).EQ.4) GO TO 440 00034200 IF (MCTACS(ITRASV).NE.4.OR.MCTANS(ITRASV).NE.1) GO TO 1040 00034300 MCTACS(ITRASV) = 1 00034400 MCTANS(ITRASV) = 4 00034500 440 MCI1 = ITRASV 00034600 C SCAN FOR NEXT PROCESS 00034700 LAST = PTNCW * MCNKP 00034800 IPIPKE = MCIKPE + 1 00034900 450 IPIPKE = IPIPKE + PTNCW 00035000 IF (IPIPKE .GT. LAST) GO TO 460 00035100 IF (PROTAB(IPIPKE).NE.KPNA.OR.PROTAB(IPIPKE+1).NE.KPRNO) 00035200 * GO TO 450 00035300 GO TO 470 00035400 C NO MORE BRANCHES (1,4) TO (1,2) 00035500 460 MCTANS(ITRASV) = 2 00035600 C 00035700 470 DO 480 00035800 * I = 1, MCNTAM 00035900 IF (MCTACS(I).EQ.0 .AND. MCTANS(I).EQ.1) GO TO 490 00036000 480 CONTINUE 00036100 C 00036200 C ERROR - TOO MANY TRACE ARRAYS 00036300 MCRTF = -16 00036400 GO TO 2000 00036500 490 MCTACS(I) = 2 00036600 MCTANS(I) = 1 00036700 MCI2 = I 00036800 IF (MCTADD(I) .NE. 0) GO TO 495 00036900 CALL USGET (MCTADD(I), LEN, ALLOC) 00037000 IF (ALLOC .LT. LEN) GO TO 1000 00037100 MCNTA = MCNTA + 1 00037200 GO TO 2000 00037300 495 CALL USZERO (MCTADD(I), LEN) 00037400 GO TO 2000 00037500 C 00037600 C END 00037700 C 00037800 500 MCTACS(1) = 1 00037900 MCTANS(1) = 2 00038000 MCTACS(2) = 2 00038100 MCTANS(2) = 1 00038200 MCI1 = 1 00038300 MCI2 = 2 00038400 C 00038500 DO 510 00038600 * I = 3, MCNTAM 00038700 MCTACS(I) = 0 00038800 MCTANS(I) = 1 00038900 510 CONTINUE 00039000 C 00039100 CALL USZERO (MCTADD(1), LEN) 00039200 CALL USZERO (MCTADD(2), LEN) 00039300 GO TO 2000 00039400 C NOT ENOUGH CORE FROM GETMAIN 00039500 1000 MCRTF = -10 00039600 GO TO 2000 00039700 C NUMBER OF OUTPUT TRACE ARRAYS NOT EQUAL TO 1 00039800 1010 MCRTF = -11 00039900 GO TO 2000 00040000 C NUMBER OF INPUT TRACE ARRAYS > 1 00040100 1020 MCRTF = -12 00040200 GO TO 2000 00040300 C NUMBER OF INPUT TRACE ARRAYS NOT EQUAL TO 1 00040400 C1030 MCRTF = -14 00040500 C GO TO 2000 00040600 C DID NOT FIND TRACE IN HOLD STATUS AT BRANCH 00040700 1040 MCRTF = -15 00040800 GO TO 2000 00040900 C NUMBER OF OUTPUT TRACE ARRAYS > 1 00041000 1050 MCRTF = -17 00041100 GO TO 2000 00041200 2000 RETURN 00041300 END 00041400