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. ΰSCParmsImpl.mesa Copyright c 1986 by Xerox Corporation. All rights reserved. Written by: Pradeep Sindhu, October 2, 1986 10:52:55 pm PDT Pradeep Sindhu, August 13, 1987 5:17:47 pm PDT Independent Parameters Dependent Parameters Parameter Constraints numBitsPerWord > 8 (from BCmd+RplySh+M/F+Id=8) numWordsPerLine > 2 (need to take log and have it be > 0) numCyclesPerLine > 2 (need to take log and have it be > 0) numBlockBits > 3 (need 5 IO lines, so block address must be at least 3 bits) Exported Procs Exchange numBlock and numPage bits if numBlock bits is too small Initialize the virtual page and block patterns Initialize the real page and block patterns DeviceId bits must be X since they are matched outside the array Κ<˜codešœ™Kšœ Οmœ1™Kšœžœžœ˜Kšœ žœžœ˜Kšœ žœžœ˜Kšœžœžœ˜K˜Kšœžœžœ˜Kšœžœžœ˜Kšœžœžœ˜Kšœžœžœ˜Kšœžœžœ˜Kšœžœžœ˜Kšœžœžœ˜K˜Kšœžœžœ˜Kšœžœžœ˜Kšœžœžœ˜Kšœžœžœ˜Kšœžœžœ˜Kšœžœžœ˜Kšœžœžœ˜—™Kšœžœžœ˜Kšœžœžœ˜Kšœžœžœ˜Kšœžœžœ˜Kšœžœžœ˜Kšœžœžœ˜ Kšœ žœžœ˜Kšœžœžœ˜Kšœžœžœ˜Kšœžœžœ˜K˜—™Kšœœ™.Kšœœ(™9Kšœœ(™:Kšœ œ>™LK˜—™š Οnœžœžœ\žœžœžœ˜‚K˜Kšœžœ˜ Kšœ ˜ Kšœ"˜"Kšœ$˜$Kšœ˜Kšœ˜Kšœ˜K˜Kšœ0˜0Kšœ2˜2Kšœ2˜2Kšœ4˜4Kšœ3˜3Kšœ5˜5Kšœ:˜:Kšœ=˜=K™@šž˜KšžœžœG˜_Kšžœžœžœ˜Kšžœ˜—Kšœžœžœžœ˜JKšœ1˜1K˜K™.šž˜Kšœ  ˜šžœžœžœž˜!K˜+Kšžœ˜—K˜K˜išžœžœžœž˜$K˜/K˜/K˜/K˜/K˜/K˜/Kšžœ˜—K˜1K˜1K˜1K˜1K˜1K˜1Kšžœ˜—K˜K™+šž˜Kšœ  ˜šžœžœžœ!ž˜0K˜+Kšžœ˜—Kšœ, ˜CK˜K™@šžœžœžœ)ž˜8K˜+Kšžœ˜—K˜K˜išžœžœžœž˜$K˜/K˜/K˜/K˜/K˜/K˜/Kšžœ˜—K˜1K˜1K˜1K˜1K˜1K˜1Kšžœ˜—K˜KšžœV˜\K˜—K˜š ‘ œž œžœžœžœ˜AKšžœ:˜@K˜—K˜š ‘ œž œžœžœžœ˜AKšžœE˜KK˜—K˜—Kšžœ˜—…—:V