Imports BitOps, BitSwOps, Dragon; Open BitOps, BitSwOps, Dragon; Cedar memBits: TYPE = ARRAY [0..5) OF BitWord; ; CacheEntry: CELL[ Vdd, GndBOOL ] InitData cellNumber: BitWord State vpValid, nvpValid: BOOL, rpValid, nrpValid: BOOL, rpDirty, nrpDirty: BOOL, master, nmaster: BOOL, shared, nshared: BOOL, victim, nvictim: BOOL, tip, ntip: BOOL, broken, nbroken: BOOL, hexVirtualPage, hexRealPage, hexBlock: HexWord, words: ARRAY [0..4) OF HexWord, parity: ARRAY [0..4) OF BOOL, virtualPage, nvirtualPage: BitDWord, realPage, nrealPage: BitDWord, block, nblock: BitWord, data: ARRAY [0..2) OF ARRAY BOOLEAN OF memBits, vpMatch, vblMatch, rpMatch, rblMatch: BOOL, selVMap, vSelCell, selRMap, rSelCell: BOOL, decodeSelect, victimAdrSelect, victimDataSelect, victimFlagSelect: BOOL, realMatchSelect, dataSelect, addressSelect, virtualDataSelect: BOOL, thisCellAdr: BitWord Initializer thisCellAdr _ cellNumber; EvalSimple oldMemBits: ARRAY [0..2) OF memBits; RWB: PROC [access: BOOL, bus, nBus: Switch, bit, nbit: BOOL] RETURNS [newBus, nNewBus: Switch, newBit, newnBit: BOOL] = { s: SwitchTypes.Strength _ IF access THEN drive ELSE none; IF access THEN { bit _ (NOT nbit) AND bus.val=H; nbit _ (NOT bit) AND nBus.val=H; bit _ (NOT nbit) AND bus.val=H; }; nNewBus _ SIBISS[bit, nBus, [[none, X], [s, L]]]; newBus _ SIBISS[nbit, bus, [[none, X], [s, L]]]; newBit _ bit; newnBit _ nbit; }; RWW: PROC [access: BOOL, busD, nBusD: SwitchMWord, field, nfield: BitWord, fieldWidth: CARDINAL] RETURNS [newField, newnField: BitWord] = TRUSTED { s: SwitchTypes.Strength _ IF access THEN drive ELSE none; IF access THEN FOR i:CARDINAL IN [0..fieldWidth) DO field _ IBIW[(NOT EBFW[nfield, fieldWidth, i]) AND busD[i].val=H, field, fieldWidth, i]; nfield _ IBIW[(NOT EBFW[field, fieldWidth, i]) AND nBusD[i].val=H, nfield, fieldWidth, i]; field _ IBIW[(NOT EBFW[nfield, fieldWidth, i]) AND busD[i].val=H, field, fieldWidth, i]; ENDLOOP; SCWTS[field, fieldWidth, 0, fieldWidth, nBusD, fieldWidth, 0, fieldWidth, [[none, X], [s, L]]]; SCWTS[nfield, fieldWidth, 0, fieldWidth, busD, fieldWidth, 0, fieldWidth, [[none, X], [s, L]]]; newField _ field; newnField _ nfield; }; RWD: PROC [access: BOOL, busD, nBusD: SwitchMWord, field, nfield: BitDWord, fieldWidth: CARDINAL] RETURNS [newField, newnField: BitDWord] = TRUSTED { s: SwitchTypes.Strength _ IF access THEN drive ELSE none; IF access THEN FOR i:CARDINAL IN [0..fieldWidth) DO field _ IBID[(NOT EBFD[nfield, fieldWidth, i]) AND busD[i].val=H, field, fieldWidth, i]; nfield _ IBID[(NOT EBFD[field, fieldWidth, i]) AND nBusD[i].val=H, nfield, fieldWidth, i]; field _ IBID[(NOT EBFD[nfield, fieldWidth, i]) AND busD[i].val=H, field, fieldWidth, i]; ENDLOOP; SCDTS[field, fieldWidth, 0, fieldWidth, nBusD, fieldWidth, 0, fieldWidth, [[none, X], [s, L]]]; SCDTS[nfield, fieldWidth, 0, fieldWidth, busD, fieldWidth, 0, fieldWidth, [[none, X], [s, L]]]; newField _ field; newnField _ nfield; }; RWM: PROC [access: BOOL, busD, nBusD: SwitchMWord, field, nfield: BitMWord, fieldWidth: CARDINAL] = TRUSTED { s: SwitchTypes.Strength _ IF access THEN drive ELSE none; IF access THEN FOR i:CARDINAL IN [0..fieldWidth) DO IBIM[(NOT EBFM[nfield, fieldWidth, i]) AND busD[i].val=H, field, fieldWidth, i]; IBIM[(NOT EBFM[field, fieldWidth, i]) AND nBusD[i].val=H, nfield, fieldWidth, i]; IBIM[(NOT EBFM[nfield, fieldWidth, i]) AND busD[i].val=H, field, fieldWidth, i]; ENDLOOP; SCMTS[field, fieldWidth, 0, fieldWidth, nBusD, fieldWidth, 0, fieldWidth, [[none, X], [s, L]]]; SCMTS[nfield, fieldWidth, 0, fieldWidth, busD, fieldWidth, 0, fieldWidth, [[none, X], [s, L]]]; }; Assert[NOT MoreThanOneOf[PAdrLow, nPAdrLow]]; Assert[NOT MoreThanOneOf[MAdrLow, nMAdrLow]]; Assert[MAdrLow OR nMAdrLow]; Assert[NOT MoreThanOneOf[VictimFeedback, ShiftVictim]]; Assert[NOT MoreThanOneOf[VictimFeedback, nVictimFeedback]]; Assert[NOT MoreThanOneOf[ShiftVictim, nShiftVictim]]; Assert[NOT MoreThanOneOf[ShiftVictim, PhBb]]; FOR i:[0..2) IN [0..2) DO oldMemBits[i] _ data[i][TRUE]; ENDLOOP; vpMatch _ DAND[nVirtualPage, virtualPage]=BitDWordZero AND DAND[nvirtualPage, VirtualPage]=BitDWordZero; vblMatch _ WAND[nVirtualBlock, block]=0 AND WAND[nblock, VirtualBlock]=0; rpMatch _ DAND[nRealPage, realPage]=BitDWordZero AND DAND[nrealPage, RealPage]=BitDWordZero; rblMatch _ WAND[nRealBlock, block]=0 AND WAND[nblock, RealBlock]=0; selVMap _ NOT broken AND vpValid AND vpMatch; vSelCell _ selVMap AND vblMatch; selRMap _ NOT broken AND rpValid AND rpMatch; rSelCell _ selRMap AND rblMatch; IF selVMap AND PhBb THEN { nMapValid _ FALSE; IF nrpDirty THEN nMatchPageClean _ FALSE; }; IF rSelCell AND PhBb THEN nRealMatch _ FALSE; decodeSelect _ SelCell AND CellAdr=thisCellAdr AND CellAdr=WNOT[nCellAdr, 8]; victimAdrSelect _ SelVictimAdr AND victim; victimDataSelect _ SelVictimData AND victim; realMatchSelect _ SelRealData AND rSelCell; IF NOT PhAb THEN dataSelect _ FALSE; IF decodeSelect OR realMatchSelect OR victimDataSelect OR ForceDataSelect THEN dataSelect _ TRUE; IF NOT PhAb THEN victimFlagSelect _ FALSE; IF decodeSelect OR ForceDataSelect THEN victimFlagSelect _ TRUE; IF NOT PhAb THEN addressSelect _ FALSE; IF decodeSelect OR victimAdrSelect THEN addressSelect _ TRUE; IF PhBb AND vSelCell THEN { nVirtualMatch _ FALSE; IF PStore AND rpDirty AND (nshared OR FinishSharedStore) THEN {master _ TRUE; nmaster _ FALSE}; IF shared THEN nMatchCellShared _ FALSE; IF tip THEN nMatchTIP _ FALSE; }; TRUSTED { busD: SwitchMWord _ DESCRIPTOR[PBits]; nBusD: SwitchMWord _ DESCRIPTOR[nPBits]; access: BOOL _ PhBb AND vSelCell AND (NOT (PStore AND (nrpDirty OR (shared AND NOT FinishSharedStore)))); IF NOT PAdrLow THEN { -- mumbo jumbo to ensure that at least one of these if clauses executes so that the instructions get updated dataFD: BitMWord _ DESCRIPTOR[data[0][FALSE]]; dataTD: BitMWord _ DESCRIPTOR[data[0][TRUE]]; RWM[access AND nPAdrLow, busD, nBusD, dataTD, dataFD, 66]; }; IF PAdrLow THEN { dataFD: BitMWord _ DESCRIPTOR[data[1][FALSE]]; dataTD: BitMWord _ DESCRIPTOR[data[1][TRUE]]; RWM[access, busD, nBusD, dataTD, dataFD, 66]; }; }; TRUSTED { busD: SwitchMWord _ DESCRIPTOR[MBits]; nBusD: SwitchMWord _ DESCRIPTOR[nMBits]; access: BOOL _ dataSelect; IF nMAdrLow THEN { dataFD: BitMWord _ DESCRIPTOR[data[0][FALSE]]; dataTD: BitMWord _ DESCRIPTOR[data[0][TRUE]]; RWM[access, busD, nBusD, dataTD, dataFD, 66]; }; IF MAdrLow THEN { dataFD: BitMWord _ DESCRIPTOR[data[1][FALSE]]; dataTD: BitMWord _ DESCRIPTOR[data[1][TRUE]]; RWM[access, busD, nBusD, dataTD, dataFD, 66]; }; [RPValid, nRPValid, rpValid, nrpValid] _ RWB[access, RPValid, nRPValid, rpValid, nrpValid]; [Master, nMaster, master, nmaster] _ RWB[access, Master, nMaster, master, nmaster]; [Shared, nShared, shared, nshared] _ RWB[access, Shared, nShared, shared, nshared]; [TIP, nTIP, tip, ntip] _ RWB[access, TIP, nTIP, tip, ntip]; [Broken, nBroken, broken, nbroken] _ RWB[access, Broken, nBroken, broken, nbroken]; }; { access: BOOL _ victimFlagSelect; [Victim, nVictim, victim, nvictim] _ RWB[access AND NOT (thisCellAdr=0 AND Resetb), Victim, nVictim, victim, nvictim]; }; { access: BOOL _ dataSelect OR (SelPageFlag AND selRMap); [VPValid, nVPValid, vpValid, nvpValid] _ RWB[access, VPValid, nVPValid, vpValid, nvpValid]; [RPDirty, nRPDirty, rpDirty, nrpDirty] _ RWB[access, RPDirty, nRPDirty, rpDirty, nrpDirty]; }; TRUSTED { busD: SwitchMWord _ DESCRIPTOR[CAMPageAccess]; nBusD: SwitchMWord _ DESCRIPTOR[nCAMPageAccess]; [virtualPage, nvirtualPage] _ RWD[(addressSelect AND VirtualAccess) OR (rSelCell AND SelRealAdr), busD, nBusD, virtualPage, nvirtualPage, 24]; }; TRUSTED { busD: SwitchMWord _ DESCRIPTOR[CAMPageAccess]; nBusD: SwitchMWord _ DESCRIPTOR[nCAMPageAccess]; [realPage, nrealPage] _ RWD[(addressSelect AND nVirtualAccess) OR (selVMap AND SelMapAdr), busD, nBusD, realPage, nrealPage, 24]; }; TRUSTED { busD: SwitchMWord _ DESCRIPTOR[CAMBlockAccess]; nBusD: SwitchMWord _ DESCRIPTOR[nCAMBlockAccess]; [block, nblock] _ RWW[addressSelect, busD, nBusD, block, nblock, 6]; }; IF ShiftVictim THEN nvictim _ NOT VictimIn; IF VictimFeedback THEN nvictim _ NOT victim; IF PhBb THEN victim _ NOT nvictim; -- this is where nPhBb is used VictimOut _ IF broken THEN VictimIn ELSE victim; IF victim AND nmaster AND PhBb THEN nVictimClean _ FALSE; IF thisCellAdr=0 AND Resetb THEN { victim _ TRUE; nvictim _ FALSE; }; hexVirtualPage _ ELFD[virtualPage, 24, 0, 24]; hexRealPage _ ELFD[realPage, 24, 0, 24]; hexBlock _ ELFW[block, 6, 0, 6]; TRUSTED { assembleWord: BitDWord; diff: BOOL _ FALSE; FOR i:[0..2) IN [0..2) DO IF oldMemBits[i]#data[i][TRUE] THEN {diff _ TRUE; EXIT}; ENDLOOP; IF diff OR Resetb THEN FOR k:[0..2) IN [0..2) DO FOR j:[0..2) IN [0..2) DO desc: BitMWord _ DESCRIPTOR[data[j][TRUE]]; FOR i:[0..32) IN [0..32) DO assembleWord _ IBID[EBFM[desc, 66, (2*i)+k], assembleWord, 32, i]; ENDLOOP; words[2*k+j] _ ELFD[assembleWord, 32, 0, 32]; parity[2*k+j] _ EBFM[desc, 66, 64+k]; ENDLOOP; ENDLOOP; } ENDCELL ÌCacheEntry.rose Last edited by: Barth, May 22, 1984 8:16:56 pm PDT Timing and housekeeping interface Buffered timing and housekeeping interface CAM interface RAM access Cell control Victim shift Ê ­˜Jšœ™Jšœ2™2J˜Jšœ!˜!Jšœ˜J˜˜Jšœ Ïkœœœ ˜(—J˜J˜šœ œ˜J˜šœ!™!Jšœ œ˜—J™šœ*™*Jšœœ˜Jšœœ˜ —J™šœ ™ Jšœœ˜"Jšœœ˜#Jšœœ˜Jšœœ˜Jšœœœ˜-Jšœ œœ˜.—J˜™ Jšœœœ˜Jšœœœ˜—J˜™ Jšœ1œ˜6Jšœ$œ˜)Jšœ œ˜Jšœœ˜Jšœuœ˜zJšœœ˜Jšœlœœœ˜Jšœœ˜Jšœœ˜Jšœœ˜ Jšœ;œ˜@Jšœœ˜—J˜™ Jšœ œ˜Jšœ ˜—Jšœ˜J˜˜J˜—˜Jšœœ˜Jšœœ˜Jšœœ˜Jšœœ˜Jšœœ˜Jšœœ˜Jšœ œ˜Jšœœ˜J˜/Jšœœœ ˜Jšœœœœ˜Jšœ$˜$Jšœ˜Jšœ˜Jš œœœœœœ ˜/Jšœ&œ˜+Jšœ&œ˜+JšœCœ˜HJšœ?œ˜DJšœ˜—šœ ˜ J˜—˜ Jšœ œœ ˜$J˜š œœ œ œœ,œ˜yJšœœœœ˜9šœœ˜Jšœœœ œ˜Jšœœœ œ˜ Jšœœœ œ˜Jšœ˜—Jšœ œœœ˜1Jšœ œœœ˜0Jšœ ˜ Jšœ˜J˜J˜—š œœ œ@œœ"œ˜“Jšœœœœ˜9š œœœœœ˜3Jš œœœœœ œ˜XJš œ œœœœœ˜ZJš œœœœœ œ˜XJšœ˜—JšœMœœ˜_JšœMœœ˜_Jšœ˜Jšœ˜J˜J˜—š œœ œAœœ#œ˜•Jšœœœœ˜9š œœœœœ˜3Jš œœœœœ œ˜XJš œ œœœœœ˜ZJš œœœœœ œ˜XJšœ˜—JšœMœœ˜_JšœMœœ˜_Jšœ˜Jšœ˜J˜J˜—š œœ œAœœ˜mJšœœœœ˜9š œœœœœ˜3Jš œœœœ œ˜PJš œœœœœ˜QJš œœœœ œ˜PJšœ˜—JšœMœœ˜_JšœMœœ˜_J˜J˜—Jšœœ#˜-Jšœœ#˜-Jšœœ ˜Jšœœ-˜7Jšœœ1˜;Jšœœ+˜5Jšœœ#˜-J˜šœ œ˜Jšœœ˜Jšœ˜—J˜Jšœ œ)œœ)˜hJšœ œœœ˜IJšœ œ#œœ#˜\Jšœ œœœ˜CJšœ œœ œ ˜-Jšœœ ˜ Jšœ œœ œ ˜-Jšœœ ˜ šœ œœ˜Jšœ œ˜Jšœ œœ˜)J˜—Jšœ œœœ˜-Jšœœœ œ˜MJšœœ˜*Jšœ!œ˜,Jšœœ ˜+Jšœœœœ˜$Jš œœœœœœ˜aJšœœœœ˜*Jšœœœœ˜@Jšœœœœ˜'Jšœœœœ˜=šœœ œ˜Jšœœ˜Jšœœ œ œœ œ œ˜_Jšœœœ˜(Jšœœ œ˜Jšœ˜—šœ˜ Jšœ œ˜&Jšœ œ ˜(Jšœœœ œœ œ œ œœ˜išœœ œÏcl˜ƒJšœ œ œ˜.Jšœ œ œ˜-Jšœœ,˜:J˜—šœ œ˜Jšœ œ œ˜.Jšœ œ œ˜-Jšœ*˜-J˜—Jšœ˜—šœ˜ Jšœ œ˜&Jšœ œ ˜(Jšœœ˜šœ œ˜Jšœ œ œ˜.Jšœ œ œ˜-Jšœ*˜-J˜—šœ œ˜Jšœ œ œ˜.Jšœ œ œ˜-Jšœ*˜-J˜—Jšœ)œ/˜[Jšœ%œ+˜SJšœ%œ+˜SJšœœ˜;Jšœ%œ+˜SJ˜—˜Jšœœ˜ Jš œ%œœœœ,˜vJ˜—˜Jšœœœœ ˜7Jšœ)œ/˜[Jšœ)œ/˜[J˜—šœ˜ Jšœ œ˜.Jšœ œ˜0Jš œœœœ œ:˜ŽJ˜—šœ˜ Jšœ œ˜.Jšœ œ˜0Jš œœœœ œ3˜J˜—šœ˜ Jšœ œ˜/Jšœ œ˜1Jšœœ/˜DJ˜—Jšœ œ œ ˜+Jšœœ œ˜,Jšœœ œ ž˜BJšœ œœ œ˜0Jš œœ œœœ˜9šœœœ˜"Jšœ œ˜Jšœ œ˜J˜—Jšœœ˜.Jšœœ˜(Jšœ œ˜ šœ˜ J˜Jšœœœ˜šœ œ˜Jš œœœ œœ˜8Jšœ˜—š œœœœ œ˜0šœ œ˜Jšœ œ œ˜+šœ œ ˜Jšœœœ*˜BJšœ˜—Jšœœ˜-Jšœœ˜%Jšœ˜—Jšœ˜—J˜——Jš˜—J˜J˜—…—&~3÷