<> <> <> <> <<>> <<>> DIRECTORY SCParms, SCUtils, Rope, SCPmCode; SCParmsImpl: CEDAR PROGRAM IMPORTS Rope, SCUtils EXPORTS SCParms ~ BEGIN ROPE: TYPE = Rope.ROPE; <> numBitsPerByte: PUBLIC NAT; numBytesPerWord: PUBLIC NAT; numWordsPerCycle: PUBLIC NAT _ 2; -- Fixed by the architecture numCyclesPerLine: PUBLIC NAT; numMemLines: PUBLIC NAT; numIOLines: PUBLIC NAT; numFIFOLines: PUBLIC NAT; vPagePattern: PUBLIC ROPE; vBlock0Pattern: PUBLIC ROPE; vBlock1Pattern: PUBLIC ROPE; vBlock2Pattern: PUBLIC ROPE; vBlock3Pattern: PUBLIC ROPE; vBlock4Pattern: PUBLIC ROPE; vBlock5Pattern: PUBLIC ROPE; rPagePattern: PUBLIC ROPE; rBlock0Pattern: PUBLIC ROPE; rBlock1Pattern: PUBLIC ROPE; rBlock2Pattern: PUBLIC ROPE; rBlock3Pattern: PUBLIC ROPE; rBlock4Pattern: PUBLIC ROPE; rBlock5Pattern: PUBLIC ROPE; <> numBitsPerWord: PUBLIC NAT; numBitsPerCycle: PUBLIC NAT; numBitsPerLine: PUBLIC NAT; numWordsPerLine: PUBLIC NAT; logNumWordsPerLine: PUBLIC NAT; logNumCyclesPerLine: PUBLIC NAT; numPageBits: PUBLIC NAT; numBlockBits: PUBLIC NAT; numDevIdBits: PUBLIC NAT; numBitsPerHeader: PUBLIC NAT; <> <> <> <> <> <> Set: PUBLIC PROC [NumBitsPerByte, NumBytesPerWord, NumCyclesPerLine, NumMemLines, NumIOLines, NumFIFOLines: NAT] RETURNS [NAT] ~ { temp: NAT; numBitsPerByte _ NumBitsPerByte; numBytesPerWord _ NumBytesPerWord; numCyclesPerLine _ NumCyclesPerLine; numMemLines _ NumMemLines; numIOLines _ NumIOLines; numFIFOLines _ NumFIFOLines; numBitsPerWord _ numBitsPerByte*numBytesPerWord; numBitsPerCycle _ numBitsPerWord*numWordsPerCycle; numBitsPerLine _ numBitsPerCycle*numCyclesPerLine; numWordsPerLine _ numWordsPerCycle*numCyclesPerLine; logNumWordsPerLine _ SCUtils.Log2[numWordsPerLine]; logNumCyclesPerLine _ SCUtils.Log2[numCyclesPerLine]; numPageBits _ (22*(numBitsPerWord-logNumWordsPerLine))/32; numBlockBits _ numBitsPerWord-numPageBits-logNumWordsPerLine; <> BEGIN IF numBlockBits < 3 THEN {temp _ numBlockBits; numBlockBits _ numPageBits; numPageBits _ temp}; IF numBlockBits < 3 THEN ERROR; END; numDevIdBits _ IF (numBitsPerWord-7) < 10 THEN (numBitsPerWord-7) ELSE 10; numBitsPerHeader _ 7+numDevIdBits+numBitsPerWord; <> BEGIN vPagePattern _ "1"; -- IO bit FOR i: NAT IN [0..numPageBits) DO vPagePattern _ Rope.Cat[vPagePattern, "0"]; ENDLOOP; vBlock0Pattern _ vBlock1Pattern _ vBlock2Pattern _ vBlock3Pattern _ vBlock4Pattern _ vBlock5Pattern _ ""; FOR i: NAT IN [0..numBlockBits-3) DO vBlock0Pattern _ Rope.Cat[vBlock0Pattern, "0"]; vBlock1Pattern _ Rope.Cat[vBlock1Pattern, "0"]; vBlock2Pattern _ Rope.Cat[vBlock2Pattern, "0"]; vBlock3Pattern _ Rope.Cat[vBlock3Pattern, "0"]; vBlock4Pattern _ Rope.Cat[vBlock4Pattern, "0"]; vBlock5Pattern _ Rope.Cat[vBlock5Pattern, "0"]; ENDLOOP; vBlock0Pattern _ Rope.Cat[vBlock0Pattern, "000"]; vBlock1Pattern _ Rope.Cat[vBlock1Pattern, "001"]; vBlock2Pattern _ Rope.Cat[vBlock2Pattern, "010"]; vBlock3Pattern _ Rope.Cat[vBlock3Pattern, "011"]; vBlock4Pattern _ Rope.Cat[vBlock4Pattern, "100"]; vBlock5Pattern _ Rope.Cat[vBlock5Pattern, "101"]; END; <> BEGIN rPagePattern _ "1"; -- IO bit FOR i: NAT IN [0..numPageBits-numDevIdBits-1) DO rPagePattern _ Rope.Cat[rPagePattern, "0"]; ENDLOOP; rPagePattern _ Rope.Cat[rPagePattern, "1"]; -- 1 bit for DeviceType <> FOR i: NAT IN [numPageBits-numDevIdBits..numPageBits) DO rPagePattern _ Rope.Cat[rPagePattern, "X"]; ENDLOOP; rBlock0Pattern _ rBlock1Pattern _ rBlock2Pattern _ rBlock3Pattern _ rBlock4Pattern _ rBlock5Pattern _ ""; FOR i: NAT IN [0..numBlockBits-3) DO rBlock0Pattern _ Rope.Cat[rBlock0Pattern, "0"]; rBlock1Pattern _ Rope.Cat[rBlock1Pattern, "0"]; rBlock2Pattern _ Rope.Cat[rBlock2Pattern, "0"]; rBlock3Pattern _ Rope.Cat[rBlock3Pattern, "0"]; rBlock4Pattern _ Rope.Cat[rBlock4Pattern, "0"]; rBlock5Pattern _ Rope.Cat[rBlock5Pattern, "0"]; ENDLOOP; rBlock0Pattern _ Rope.Cat[rBlock0Pattern, "000"]; rBlock1Pattern _ Rope.Cat[rBlock1Pattern, "001"]; rBlock2Pattern _ Rope.Cat[rBlock2Pattern, "010"]; rBlock3Pattern _ Rope.Cat[rBlock3Pattern, "011"]; rBlock4Pattern _ Rope.Cat[rBlock4Pattern, "100"]; rBlock5Pattern _ Rope.Cat[rBlock5Pattern, "101"]; END; RETURN[NumBitsPerByte*NumBytesPerWord*NumCyclesPerLine*NumMemLines*NumIOLines*NumFIFOLines]; }; PagePatternHi: PUBLIC PROC [pagePattern: ROPE] RETURNS [ROPE] ~ { RETURN[Rope.Substr[pagePattern, 0, numPageBits+1-numDevIdBits]]; }; PagePatternLo: PUBLIC PROC [pagePattern: ROPE] RETURNS [ROPE] ~ { RETURN[Rope.Substr[pagePattern, numPageBits+1-numDevIdBits, numDevIdBits]]; }; END.