# ALLOST - ALLOCATE STAGING MEMORY FOR A VIRTUAL CHANNEL # # PURPOSE: CONTROL THE STAGING MEMORY ALLOCATION BITMAP TO IDENTIFY CONTIGUOUS # REGIONS OF STAGER MEMORY FOR VIRTUAL CHANNEL BUFFERS # # CALLING SEQUENCE: # # INTEGER = ALLOST(BITMAP,BITLEN,BITGRN,STGADR,STGBFL,NBUFF,STGTOT) # # INPUTS: BITMAP IS THE STAGER ALLOCATION BITMAP ARRAY # BITLEN IS THE LENGTH OF THE BITMAP IN WORDS # BITGRN IS THE BITMAP GRANULARITY IN STAGER WORDS # STGBFL IS THE LENGTH OF A SINGLE STAGER BUFFER TO BE ALLOCATED # IN WORDS # NBUFF IS THE NUMBER OF SUCH BUFFERS TO BE ALLOCATED # # OUTPUTS: STGADR IS THE BASE ADDRESS OF THE STAGING MEMORY SECTION ALLOCATED # FOR THE VIRTUAL CHANNEL # STGTOT IS THE TOTAL NUMBER OF WORDS ALLOCATED # INTEGER RESULT IS ZERO IF THE ALLOCATION WAS MADE SUCCESSFULLY, # NEGATIVE IF THE ALLOCATION FAILED # # PROGRAMMER: CARL T. MICKELSON # GOODYEAR AEROSPACE CORP # 1210 MASSILLON ROAD # AKRON, OHIO 44315 # # PROJECT: MASSIVELY PARALLEL PROCESSOR (MPP) # # DATE: APRIL 1983 # ## INCLUDE "SMMDEF.RAT" INTEGER FUNCTION ALLOST(BITMAP,BITLEN,BITGRN,STGADR,STGBFL,NBUFF,STGTOT) INTEGER BITMAP(0:1) INTEGER BITLEN INTEGER BITGRN INTEGER*4 STGADR INTEGER*4 STGBFL INTEGER NBUFF INTEGER*4 STGTOT INCLUDE "CSMMDF.RAT" INTEGER*4 PAGES,TEMP4,MASK4,SMASK4,TANDM,ONE INTEGER WSIZE,WDIDX,STIDX,WDAVL,ILOBIT,LOBIT,RESIDU,TRIALS,TRYS INTEGER TEMP2(2),MASK2(2),SMASK2(2) EQUIVALENCE (TEMP4,TEMP2(1)) EQUIVALENCE (MASK4,MASK2(1)) EQUIVALENCE (SMASK4,SMASK2(1)) DATA ONE/1/ ALLOST = 0 # ASSUME ALLOCATION WILL SUCCEED STGTOT = STGBFL * NBUFF # COMPUTE TOTAL MEMORY REQUIREMENT IF (STGTOT == 0) $( # IF NO MEMORY REQUESTED ALLOST = -24 # SET ERROR CODE $) ELSE $( # ELSE, SOME MEMORY WAS REQUESTED IF (STGTOT > (NBANKS * NWORDS)) $( # IF TOO MUCH WAS REQUESTED STGTOT = 0 # SHOW NO MEMORY ALLOCATED ALLOST = -25 # SET ERROR CODE $) ELSE $( # ELSE, TRY TO ALLOCATE SOME MEMORY SMASK4 = 0 # INITIALIZE INITIAL TRIAL BIT MASK TRIALS = 0 # INITIALIZE MASK TRIALS COUNT ILOBIT = 0 # INITIALIZE LOW BIT POSITION OF MASK PAGES = (STGTOT + (BITGRN-1)) / BITGRN # COMPUTE NUMBER OF MEMORY PAGES REQUIRED IF (PAGES <= 2 * (BTWDTH-1)) $( # IF SMALL NUMBER OF PAGES WSIZE = 0 # SET NUMBER OF INTERVENING ZERO WORDS TO ZERO RESIDU = PAGES # SET RESIDUE TO NUMBER OF PAGES $) # END SMALL PAGE COUNT BLOCK ELSE $( # ELSE, PAGE COUNT IS LARGE WSIZE = (PAGES - (BTWDTH-1)) / BTWDTH # COMPUTE NUMBER OF CONTIGUOUS ZERO WORDS REQUIRED' RESIDU = PAGES - (BTWDTH * WSIZE) # COMPUTE NUMBER OF EXTRA ZEROS NEEDED IF (RESIDU == (BTWDTH-1)) $( # IF BTWDTH-1 EXTRA NEEDED, THEY MUST BE ADJACENT TO CONTIGUOUS GROUP TRIALS = BTWDTH # SET TEST TRIAL COUNT ILOBIT = 1 # SET LOW BIT TO POSITION ONE SMASK2(1) = -2 # SET BTWDTH-1 BITS IN STARTING MASK $) # END BTWDTH-1 EXTRA NEEDED BLOCK $) # END LARGE PAGE COUNT BLOCK IF (TRIALS == 0) $( # IF NOT SPECIAL CASE ABOVE TRIALS = ((2 * BTWDTH) + 1) - RESIDU # COMPUTE NUMBER OF TEST TRIALS SMASK4 = ISHFT(ONE,RESIDU) - ONE # COMPUTE STARTING MASK $) # END NOT SPECIAL CASE BLOCK WDIDX = 1 # SET INITIAL SEARCH INDEX REPEAT $( # REPEAT UNTIL ENOUGH ZEROS ARE FOUND MASK4 = SMASK4 # INITIALIZE TRIAL MASK LOBIT = ILOBIT # INITIALIZE LOW BIT POSITION IF (WSIZE .NE. 0) $( # IF SOME INTERVENING ZERO WORDS NEEDED FOR ( ; BITMAP(WDIDX) .NE. 0; WDIDX = WDIDX + 1) $( # SEARCH FOR FIRST ZERO WORD IF (WDIDX >= BITLEN) $( # IF BITMAP EXHAUSTED STGTOT = 0 # SHOW NO MEMORY ALLOCATED ALLOST = -26 # SET ERROR CODE RETURN # EXIT SUBROUTINE $) # END BITMAP EXHAUSTED BLOCK $) # END SEARCH BITMAP BLOCK $) # END SOME INTERVENING WORDS REQUIRED BLOCK STIDX = WDIDX - 1 # POINT AT WORD CONTAINING START OF ZERO STRING WDAVL = 0 # INITIALIZE COUNT OF ZERO WORDS IF (WSIZE .NE. 0) $( # IF SOME INTERVENING ZERO WORDS REQUIRED FOR ( ; BITMAP(WDIDX) == 0; WDIDX = WDIDX + 1) $( # SEARCH FOR ENOUGH ZERO WORDS FOR ALLOCATION IF (WDIDX >= BITLEN) $( # IF BITMAP EXHAUSTED STGTOT = 0 # SHOW NO MEMORY ALLOCATED ALLOST = -26 # SET ERROR CODE RETURN # EXIT SUBROUTINE $) # END BITMAP EXHAUSTED BLOCK WDAVL = WDAVL + 1 # COUNT WORD AS AVAILABLE IF (WDAVL >= WSIZE) BREAK # IF FOUND ENOUGH WORDS, QUIT LOOP $) # END SEARCH FOR ENOUGH WORDS BLOCK WDIDX = WDIDX + 1 # NEXT WORD IS ADJACENT TO INTERVENING ZEROS $) # END INTERVENING WORDS REQUIRED BLOCK TEMP2(1) = BITMAP(STIDX) # PICK UP WORD BEFORE ZEROS TEMP2(2) = BITMAP(WDIDX) # PICK UP WORD AFTER ZEROS DO TRYS = 1,TRIALS $( # TEST MASK IN EACH POSSIBLE POSITION TANDM = IAND(TEMP4,MASK4) # TEST FOR ENOUGH ZEROS IN TEMPORARY IF (TANDM == 0) BREAK # IF ENOUGH, QUIT TRYING MASK4 = JISHFT(MASK4,1) # ELSE, SHIFT MASK LOBIT = LOBIT + 1 # BUMP LOW BIT POSITION $) # END TEST EACH POSITION LOOP IF (TANDM == 0) BREAK # IF LONG ENOUGH ZERO STRING FOUND, DONE WDIDX = WDIDX + 1 # BUMP TO START OF NEW SEARCH REGION IF (WDIDX >= BITLEN) $( # IF BITMAP EXHAUSTED STGTOT = 0 # SHOW NO MEMORY ALLOCATED ALLOST = -26 # SET ERROR CODE RETURN # EXIT SUBROUTINE $) # END BITMAP EXHAUSTED BLOCK $) # END SEARCH BITMAP BLOCK TANDM = STIDX #-FORCE CALCULATION OF STGADR INTO 32 BIT MODE STGADR = BITGRN * ((BTWDTH * TANDM) + LOBIT) # COMPUTE STAGER BUFFER ADDRESS BITMAP(STIDX) = IOR(BITMAP(STIDX),MASK2(1)) # SET BITS IN BITMAP BITMAP(WDIDX) = IOR(BITMAP(WDIDX),MASK2(2)) IF (WSIZE .NE. 0) $( # IF EXTRA WORDS USED DO I = STIDX+1,WDIDX-1 # FOR INTERVENING WORDS BITMAP(I) = -1 # SET BITS IN EXTRA WORDS $) # END EXTRA WORDS BLOCK $) # END ALLOCATE SOME MEMORY BLOCK $) # END SOME MEMORY REQUESTED BLOCK RETURN END