CachePInterfacePCtl.Mesa
created by RoseTranslate from CachePInterfacePCtl.Rose of January 29, 1985 9:37:11 pm PST for curry.pa at January 29, 1985 9:37:17 pm PST
DIRECTORY
RoseTypes, RoseCreate, BitOps, Dragon;
CachePInterfacePCtl: CEDAR PROGRAM
IMPORTS RoseCreate, BitOps =
BEGIN OPEN
RoseTypes, BitOps;
Signal Type decls
PBusFaults: TYPE = Dragon.PBusFaults;
PBusCommands: TYPE = Dragon.PBusCommands;
RegisterCells: PROC =
BEGIN
[] ← RoseCreate.RegisterCellType[name: "PCtl",
expandProc: NIL,
ioCreator: CreatePCtlIO, initializer: InitializePCtl,
evals: [EvalSimple: PCtlEvalSimple],
blackBox: NIL, stateToo: NIL,
ports: CreatePCtlPorts[],
drivePrototype: NEW [PCtlDrive]];
END;
otherss: SymbolTable ← RoseCreate.GetOtherss["CachePInterfacePCtl.pass"];
CreatePCtlPorts: PROC RETURNS [ports: Ports] = {ports ← RoseCreate.PortsFromFile["CachePInterfacePCtl.PCtl.rosePorts"]};
PCtlIORef: TYPE = REF PCtlIORec;
PCtlIORec: TYPE = MACHINE DEPENDENT RECORD [
fill0(0:0..14): [0..32767],
Vdd(0:15..15): BOOLEAN,
fill1(1:0..14): [0..32767],
Gnd(1:15..15): BOOLEAN,
fill2(2:0..14): [0..32767],
PhAb(2:15..15): BOOLEAN,
fill3(3:0..14): [0..32767],
PhBb(3:15..15): BOOLEAN,
fill4(4:0..14): [0..32767],
Resetb(4:15..15): BOOLEAN,
fill5(5:0..14): [0..32767],
nVQMatchB(5:15..15): BOOLEAN,
fill6(6:0..14): [0..32767],
nQuadSharedB(6:15..15): BOOLEAN,
fill7(7:0..14): [0..32767],
PStoreAB(7:15..15): BOOLEAN,
fill8(8:0..14): [0..32767],
nPStoreAB(8:15..15): BOOLEAN,
fill9(9:0..11): [0..4095],
PQSelAB(9:12..15): [0..15],
fill10(10:0..14): [0..32767],
nPageDirtyB(10:15..15): BOOLEAN,
fill11(11:0..14): [0..32767],
SenseVMatchA(11:15..15): BOOLEAN,
fill12(12:0..14): [0..32767],
MDoneAB(12:15..15): BOOLEAN,
fill13(13:0..14): [0..32767],
MHeldAB(13:15..15): BOOLEAN,
fill14(14:0..11): [0..4095],
MFaultAB(14:12..15): PBusFaults,
fill15(15:0..11): [0..4095],
PCmdToMAB(15:12..15): PBusCommands,
fill16(16:0..11): [0..4095],
PAdr2831AB(16:12..15): [0..15],
fill17(17:0..14): [0..32767],
DriveVirtualPageAdrBA(17:15..15): BOOLEAN,
fill18(18:0..14): [0..32767],
DriveVirtualBlockAdrBA(18:15..15): BOOLEAN,
fill19(19:0..14): [0..32767],
StartWordMachineBA(19:15..15): BOOLEAN,
PDataI(20:0..31): ARRAY [0..2) OF CARDINAL,
fill21(22:0..14): [0..32767],
DrivePDataB(22:15..15): BOOLEAN,
fill22(23:0..14): [0..32767],
DrivePDataI(23:15..15): BOOLEAN,
fill23(24:0..11): [0..4095],
PCmdI(24:12..15): PBusCommands,
fill24(25:0..14): [0..32767],
PRejectDriveHigh(25:15..15): BOOLEAN,
fill25(26:0..14): [0..32767],
PRejectDriveLow(26:15..15): BOOLEAN,
fill26(27:0..14): [0..32767],
PFaultDrive(27:15..15): BOOLEAN,
fill27(28:0..11): [0..4095],
PFaultI(28:12..15): PBusFaults,
fill28(29:0..14): [0..32767],
PNPErrorDriveLow(29:15..15): BOOLEAN,
fill29(30:0..14): [0..32767],
VARegSensePDataIA(30:15..15): BOOLEAN,
fill30(31:0..14): [0..32767],
LastRefRegSenseVARegB(31:15..15): BOOLEAN,
fill31(32:0..14): [0..32767],
PageDriveCAMBitsA(32:15..15): BOOLEAN,
fill32(33:0..14): [0..32767],
BlockDriveCAMBitsA(33:15..15): BOOLEAN,
fill33(34:0..14): [0..32767],
RefMatchesLastRefReg(34:15..15): BOOLEAN,
fill34(35:0..14): [0..32767],
PRamRegSensePDataIB(35:15..15): BOOLEAN,
fill35(36:0..14): [0..32767],
PRamRegDrivePDataIB(36:15..15): BOOLEAN,
fill36(37:0..14): [0..32767],
PRamRegSensePBitsB(37:15..15): BOOLEAN,
fill37(38:0..14): [0..32767],
PRamRegDrivePBitsB(38:15..15): BOOLEAN,
fill38(39:0..14): [0..32767],
PRamRegParityOut(39:15..15): BOOLEAN,
fill39(40:0..13): [0..16383],
PAdr3031AB(40:14..15): [0..3]];
port indices:
PCtlDrive: TYPE = MACHINE DEPENDENT RECORD [
fill0(0:0..14): [0 .. 32768),
Vdd(0:15..15): BOOLEAN,
fill1(1:0..14): [0 .. 32768),
Gnd(1:15..15): BOOLEAN,
fill2(2:0..14): [0 .. 32768),
PhAb(2:15..15): BOOLEAN,
fill3(3:0..14): [0 .. 32768),
PhBb(3:15..15): BOOLEAN,
fill4(4:0..14): [0 .. 32768),
Resetb(4:15..15): BOOLEAN,
fill5(5:0..14): [0 .. 32768),
nVQMatchB(5:15..15): BOOLEAN,
fill6(6:0..14): [0 .. 32768),
nQuadSharedB(6:15..15): BOOLEAN,
fill7(7:0..14): [0 .. 32768),
PStoreAB(7:15..15): BOOLEAN,
fill8(8:0..14): [0 .. 32768),
nPStoreAB(8:15..15): BOOLEAN,
fill9(9:0..14): [0 .. 32768),
PQSelAB(9:15..15): BOOLEAN,
fill10(10:0..14): [0 .. 32768),
nPageDirtyB(10:15..15): BOOLEAN,
fill11(11:0..14): [0 .. 32768),
SenseVMatchA(11:15..15): BOOLEAN,
fill12(12:0..14): [0 .. 32768),
MDoneAB(12:15..15): BOOLEAN,
fill13(13:0..14): [0 .. 32768),
MHeldAB(13:15..15): BOOLEAN,
fill14(14:0..14): [0 .. 32768),
MFaultAB(14:15..15): BOOLEAN,
fill15(15:0..14): [0 .. 32768),
PCmdToMAB(15:15..15): BOOLEAN,
fill16(16:0..14): [0 .. 32768),
PAdr2831AB(16:15..15): BOOLEAN,
fill17(17:0..14): [0 .. 32768),
DriveVirtualPageAdrBA(17:15..15): BOOLEAN,
fill18(18:0..14): [0 .. 32768),
DriveVirtualBlockAdrBA(18:15..15): BOOLEAN,
fill19(19:0..14): [0 .. 32768),
StartWordMachineBA(19:15..15): BOOLEAN,
fill20(20:0..14): [0 .. 32768),
PDataI(20:15..15): BOOLEAN,
fill21(21:0..14): [0 .. 32768),
DrivePDataB(21:15..15): BOOLEAN,
fill22(22:0..14): [0 .. 32768),
DrivePDataI(22:15..15): BOOLEAN,
fill23(23:0..14): [0 .. 32768),
PCmdI(23:15..15): BOOLEAN,
fill24(24:0..14): [0 .. 32768),
PRejectDriveHigh(24:15..15): BOOLEAN,
fill25(25:0..14): [0 .. 32768),
PRejectDriveLow(25:15..15): BOOLEAN,
fill26(26:0..14): [0 .. 32768),
PFaultDrive(26:15..15): BOOLEAN,
fill27(27:0..14): [0 .. 32768),
PFaultI(27:15..15): BOOLEAN,
fill28(28:0..14): [0 .. 32768),
PNPErrorDriveLow(28:15..15): BOOLEAN,
fill29(29:0..14): [0 .. 32768),
VARegSensePDataIA(29:15..15): BOOLEAN,
fill30(30:0..14): [0 .. 32768),
LastRefRegSenseVARegB(30:15..15): BOOLEAN,
fill31(31:0..14): [0 .. 32768),
PageDriveCAMBitsA(31:15..15): BOOLEAN,
fill32(32:0..14): [0 .. 32768),
BlockDriveCAMBitsA(32:15..15): BOOLEAN,
fill33(33:0..14): [0 .. 32768),
RefMatchesLastRefReg(33:15..15): BOOLEAN,
fill34(34:0..14): [0 .. 32768),
PRamRegSensePDataIB(34:15..15): BOOLEAN,
fill35(35:0..14): [0 .. 32768),
PRamRegDrivePDataIB(35:15..15): BOOLEAN,
fill36(36:0..14): [0 .. 32768),
PRamRegSensePBitsB(36:15..15): BOOLEAN,
fill37(37:0..14): [0 .. 32768),
PRamRegDrivePBitsB(37:15..15): BOOLEAN,
fill38(38:0..14): [0 .. 32768),
PRamRegParityOut(38:15..15): BOOLEAN,
fill39(39:0..14): [0 .. 32768),
PAdr3031AB(39:15..15): BOOLEAN];
CreatePCtlIO: PROC [cell: Cell] --IOCreator-- = {
cell.realCellStuff.newIO ← NEW [PCtlIORec];
cell.realCellStuff.oldIO ← NEW [PCtlIORec];
};
PCtlStateRef: TYPE = REF PCtlStateRec;
PCtlStateRec: TYPE = RECORD [
PCmdLatchAB: PBusCommands,
RejectAB, RejectBA, ParityError, ParityErrorLatch: BOOL,
IsNoOpBA: BOOL,
Mask, MustBeOne: BitWord,
LastQuad, ValidWordsAB, ValidWordsBA: BitWord,
RequestMatchAB: BOOL,
Combinatorial signals, not really state bits
IOReferenceAB, CacheStoreReferenceAB, CacheReferenceAB, FetchReferenceAB, HoldReferenceAB, StoreReferenceAB, RunCAM: BOOL
];
InitializePCtl: Initializer = {
IF leafily THEN
BEGIN
state: PCtlStateRef ← NEW [PCtlStateRec];
cell.realCellStuff.state ← state;
END;
};
PCtlEvalSimple: CellProc =
BEGIN
newIO: PCtlIORef ← NARROW[cell.realCellStuff.newIO];
state: PCtlStateRef ← NARROW[cell.realCellStuff.state];
BEGIN OPEN newIO, state;
IF Resetb THEN {
PCmdLatchAB ← NoOp;
RejectAB ← FALSE;
RejectBA ← FALSE;
ParityError ← FALSE;
ParityErrorLatch ← FALSE;
Mask ← 0;
ValidWordsAB ← 0FH;
};
VARegSensePDataIA ← PhAb AND NOT RejectBA;
LastRefRegSenseVARegB ← PhBb AND MDoneAB;
IF LastRefRegSenseVARegB THEN LastQuad ← ECFW[PAdr2831AB, 4, 0, 2];
RunCAM ← (NOT RejectBA) OR MDoneAB;
BlockDriveCAMBitsA ← PhAb AND (DriveVirtualBlockAdrBA OR RunCAM);
PageDriveCAMBitsA ← PhAb AND (DriveVirtualPageAdrBA OR RunCAM);
SenseVMatchA ← PhAb AND RunCAM;
IF VARegSensePDataIA THEN {
adrBits: BitWord ← 0;
adrBits ← IBIW[EBFD[PDataI, 32, 2], adrBits, 4, 0];
adrBits ← IBIW[EBFD[PDataI, 32, 3], adrBits, 4, 1];
adrBits ← IBIW[EBFD[PDataI, 32, 22], adrBits, 4, 2];
adrBits ← IBIW[EBFD[PDataI, 32, 23], adrBits, 4, 3];
RequestMatchAB ← WAND[Mask, adrBits]=WAND[Mask, MustBeOne];
PCmdLatchAB ← PCmdI;
PAdr2831AB ← MDTW[PDataI, 32, 28, 4, PAdr2831AB, 4, 0, 4];
};
IOReferenceAB ← PCmdLatchAB=IOFetch OR PCmdLatchAB=IOStore OR PCmdLatchAB=IOFetchHold OR PCmdLatchAB=IOStoreHold;
CacheStoreReferenceAB ← PCmdLatchAB=Store OR PCmdLatchAB=StoreHold;
CacheReferenceAB ← PCmdLatchAB=Fetch OR PCmdLatchAB=FetchHold OR CacheStoreReferenceAB;
FetchReferenceAB ← PCmdLatchAB=Fetch OR PCmdLatchAB=FetchHold OR PCmdLatchAB=IOFetch OR PCmdLatchAB=IOFetchHold;
HoldReferenceAB ← PCmdLatchAB=FetchHold OR PCmdLatchAB=StoreHold OR PCmdLatchAB=IOFetchHold OR PCmdLatchAB=IOStoreHold;
StoreReferenceAB ← CacheStoreReferenceAB OR PCmdLatchAB=IOStore OR PCmdLatchAB=IOStoreHold;
IF PhBb THEN ValidWordsBA ← ValidWordsAB;
IF PhAb AND StartWordMachineBA THEN ValidWordsAB ← IBIW[TRUE, 0, 4, ECFW[PAdr2831AB, 4, 2, 2]];
IF PhAb AND NOT StartWordMachineBA THEN
FOR i:[0..4) IN [0..4) DO
IF EBFW[ValidWordsBA, 4, i] THEN {
FOR j:[0..4) IN [1..4) DO
k: [0..4) ← (i+j) MOD 4;
IF NOT EBFW[ValidWordsBA, 4, k] THEN {
ValidWordsAB ← IBIW[TRUE, ValidWordsBA, 4, k];
GOTO Done;
};
ENDLOOP;
GOTO Done;
};
REPEAT
Done => NULL;
ENDLOOP;
IF PhBb THEN {
RejectBA ← NOT MDoneAB AND RequestMatchAB AND
(IOReferenceAB OR (HoldReferenceAB AND NOT MHeldAB) OR
(CacheReferenceAB AND
(nVQMatchB OR NOT
(NOT (RefMatchesLastRefReg AND ECFW[PAdr2831AB, 4, 0, 2]=LastQuad) OR EBFW[ValidWordsAB, 4, ECFW[PAdr2831AB, 4, 2, 2]]))) OR
(CacheStoreReferenceAB AND
(nPageDirtyB OR NOT nQuadSharedB)));
IsNoOpBA ← PCmdLatchAB=NoOp;
};
IF PhAb THEN RejectAB ← RejectBA;
PStoreAB ← CacheStoreReferenceAB;
nPStoreAB ← NOT PStoreAB;
PQSelAB ← IF NOT CacheReferenceAB THEN 0 ELSE SELECT ECFW[PAdr2831AB, 4, 0, 2] FROM
0 => 8,
1 => 4,
2 => 2,
3 => 1,
ENDCASE => ERROR;
PCmdToMAB ← IF RequestMatchAB THEN PCmdLatchAB ELSE NoOp;
DrivePDataB ← PhBb AND RequestMatchAB AND FetchReferenceAB;
DrivePDataI ← NOT DrivePDataB;
PRejectDriveHigh ← PhBb AND RequestMatchAB AND (RejectBA OR (MDoneAB AND MFaultAB#Dragon.None));
PRejectDriveLow ← PhAb;
PFaultDrive ← (PhBb AND RequestMatchAB) OR PhAb;
PFaultI ← IF MDoneAB AND PhBb THEN MFaultAB ELSE Dragon.None;
IF PhAb THEN ParityError ← PRamRegParityOut AND NOT RejectBA AND NOT IsNoOpBA;
IF PhBb AND ParityError THEN ParityErrorLatch ← TRUE;
PNPErrorDriveLow ← ParityErrorLatch;
PRamRegDrivePBitsB ← PhBb AND StoreReferenceAB AND (PCmdLatchAB#StoreHold OR MHeldAB);
PRamRegDrivePDataIB ← PhBb AND FetchReferenceAB;
PRamRegSensePBitsB ← PRamRegDrivePDataIB;
PRamRegSensePDataIB ← PhBb AND StoreReferenceAB AND NOT RejectAB;
PAdr3031AB ← MWTW[PAdr2831AB, 4, 2, 2, PAdr3031AB, 2, 0, 2];
END;
END;
RegisterCells[];
END.