Directory CacheOps; Imports BitOps, BitSwOps, Dragon; Open BitOps, BitSwOps, Dragon; MCtlEntryCtl: CELL[ Vdd, GndINT[4], nQDirtyB=INT[4], RPValidBitA, nRPValidBitA, RPDirtyBitA, nRPDirtyBitA, VPValidBitA, nVPValidBitA=BIT-S-X, ForceAllDataSelectsBA>BOOL, CellAdrBA, nCellAdrBA>INT[7], SelMapAdrBA, SelRPBA, SelRealDataBA>BOOL, PAdr2829ABBOOL ] State RefreshCountAB, RefreshCountBA: CARDINAL, VictimCountAB, VictimCountBA: CARDINAL, LatchVPValidBA, LatchRPDirtyBA: BOOL, VictimDirtyBitsAB, VictimDirtyBitsBA: BitWord, Adr2829BA: CARDINAL, DoGetAdrBA, DoRefreshBA: BOOL EvalSimple DriveBit: PROC[bit, nBit: Switch, dBit: BOOL] RETURNS [newBit, newNBit: Switch] = { newBit _ SIBISS[dBit, bit, [[driveStrong, L], [driveStrong, H]]]; newNBit _ SIBISS[dBit, nBit, [[driveStrong, H], [driveStrong, L]]]; }; { s: SwitchTypes.Strength _ IF PhBb THEN drive ELSE none; VPValidBitA _ SIBISS[TRUE, VPValidBitA, [[none, X], [s, H]]]; nVPValidBitA _ SIBISS[TRUE, nVPValidBitA, [[none, X], [s, H]]]; RPValidBitA _ SIBISS[TRUE, RPValidBitA, [[none, X], [s, H]]]; nRPValidBitA _ SIBISS[TRUE, nRPValidBitA, [[none, X], [s, H]]]; RPDirtyBitA _ SIBISS[TRUE, RPDirtyBitA, [[none, X], [s, H]]]; nRPDirtyBitA _ SIBISS[TRUE, nRPDirtyBitA, [[none, X], [s, H]]]; QValidA _ SIBISS[TRUE, QValidA, [[none, X], [s, H]]]; nQValidA _ SIBISS[TRUE, nQValidA, [[none, X], [s, H]]]; QMasterA _ SIBISS[TRUE, QMasterA, [[none, X], [s, H]]]; nQMasterA _ SIBISS[TRUE, nQMasterA, [[none, X], [s, H]]]; QSharedA _ SIBISS[TRUE, QSharedA, [[none, X], [s, H]]]; nQSharedA _ SIBISS[TRUE, nQSharedA, [[none, X], [s, H]]]; }; Assert[NOT MoreThanOneOf[SetSharedA, ResetVPValidA, SetFlagsA, ResetMasterA]]; IF Resetb AND PhAb THEN { [VPValidBitA, nVPValidBitA] _ DriveBit[VPValidBitA, nVPValidBitA, FALSE]; [RPValidBitA, nRPValidBitA] _ DriveBit[RPValidBitA, nRPValidBitA, FALSE]; [RPDirtyBitA, nRPDirtyBitA] _ DriveBit[RPDirtyBitA, nRPDirtyBitA, FALSE]; [QMasterA, nQMasterA] _ DriveBit[QMasterA, nQMasterA, FALSE]; [QSharedA, nQSharedA] _ DriveBit[QSharedA, nQSharedA, FALSE]; [QValidA, nQValidA] _ DriveBit[QValidA, nQValidA, FALSE]; }; IF SetSharedA THEN [QSharedA, nQSharedA] _ DriveBit[QSharedA, nQSharedA, TRUE]; IF SetRPDirtyVPValidA THEN { [VPValidBitA, nVPValidBitA] _ DriveBit[VPValidBitA, nVPValidBitA, LatchVPValidBA]; [RPDirtyBitA, nRPDirtyBitA] _ DriveBit[RPDirtyBitA, nRPDirtyBitA, LatchRPDirtyBA]; }; IF FlagLatchB THEN { LatchVPValidBA _ EBFD[MDataI, 32, 30]; LatchRPDirtyBA _ EBFD[MDataI, 32, 31]; }; IF ResetVPValidA THEN [VPValidBitA, nVPValidBitA] _ DriveBit[VPValidBitA, nVPValidBitA, FALSE]; IF SetFlagsA THEN { [VPValidBitA, nVPValidBitA] _ DriveBit[VPValidBitA, nVPValidBitA, TRUE]; [RPValidBitA, nRPValidBitA] _ DriveBit[RPValidBitA, nRPValidBitA, TRUE]; [RPDirtyBitA, nRPDirtyBitA] _ DriveBit[RPDirtyBitA, nRPDirtyBitA, NOT IsCleanBA]; [QMasterA, nQMasterA] _ DriveBit[QMasterA, nQMasterA, FALSE]; [QSharedA, nQSharedA] _ DriveBit[QSharedA, nQSharedA, LatchSharedBA]; [QValidA, nQValidA] _ DriveBit[QValidA, nQValidA, TRUE]; }; IF ResetMasterA THEN [QMasterA, nQMasterA] _ DriveBit[QMasterA, nQMasterA, FALSE]; IF PhAb THEN { RefreshCountAB _ RefreshCountBA; VictimCountAB _ VictimCountBA; VictimDirtyBitsAB _ VictimDirtyBitsBA; }; IF IncrementRefreshB THEN RefreshCountBA _ (RefreshCountAB+1) MOD 512; IF IncrementVictimB THEN VictimCountBA _ (VictimCountAB+1) MOD 4; Assert[NOT MoreThanOneOf[SampleDirtyBitsB, DeleteDirtyBitB]]; IF SampleDirtyBitsB THEN VictimDirtyBitsBA _ nQDirtyB; FOR i:[0..4) IN [0..4) DO IF EBFW[VictimDirtyBitsAB, 4, i] THEN { SomeDirtyBA _ TRUE; EXIT; }; EXITS FINISHED => SomeDirtyBA _ FALSE; ENDLOOP; IF DeleteDirtyBitB THEN FOR i:[0..4) IN [0..4) DO IF EBFW[VictimDirtyBitsAB, 4, i] THEN { VictimDirtyBitsBA _ IBIW[FALSE, VictimDirtyBitsAB, 4, i]; EXIT; }; ENDLOOP; DoGetAdrBA _ MGntSenseBA AND IfGrantThenGetAdrElseRefreshToDecoderBA; DoRefreshBA _ ((NOT MGntSenseBA) AND IfGrantThenGetAdrElseRefreshToDecoderBA) OR RefreshToDecoderBA; Assert[NOT MoreThanOneOf[VictimToDecoderBA, DoRefreshBA]]; IF VictimToDecoderBA THEN CellAdrBA _ MWTW[VictimCountBA, 7, 0, 7, 0, 7, 0, 7]; Assert[NOT MoreThanOneOf[DoRefreshBA, DirtyBitsToMQSelBA, Adr2829ToMQSelBA]]; IF DoRefreshBA THEN { CellAdrBA _ MWTW[RefreshCountBA, 9, 0, 7, 0, 7, 0, 7]; MQSelBA _ SELECT ECFW[RefreshCountBA, 9, 7, 2] FROM 0 => 1, 1 => 2, 2 => 4, 3 => 8, ENDCASE => ERROR; }; nCellAdrBA _ WNOT[CellAdrBA, 7]; IF Resetb THEN MQSelBA _ 0FH; IF DirtyBitsToMQSelBA THEN { MQSelBA _ 0; FOR i:[0..4) IN [0..4) DO IF EBFW[VictimDirtyBitsBA, 4, i] THEN { MQSelBA _ IBIW[TRUE, 0, 4, i]; EXIT; }; ENDLOOP; }; Assert[NOT MoreThanOneOf[SamplePAdr2829B, SampleMAdr2829B]]; IF SamplePAdr2829B THEN Adr2829BA _ ECFW[PAdr2829AB, 4, 0, 2]; IF SampleMAdr2829B THEN Adr2829BA _ ECFD[MDataI, 32, 28, 2]; IF Adr2829ToMQSelBA THEN MQSelBA _ SELECT Adr2829BA FROM 0 => 1, 1 => 2, 2 => 4, 3 => 8, ENDCASE => ERROR; Assert[NOT MoreThanOneOf[AddressBitsToMDataIA, AddressBitsLowZeroToMDataIA]]; IF AddressBitsToMDataIA THEN MDataI _ MWTD[PAdr2829AB, 4, 0, 4, MDataI, 32, 28, 4]; IF AddressBitsLowZeroToMDataIA THEN { MDataI _ MWTD[PAdr2829AB, 4, 0, 2, MDataI, 32, 28, 2]; MDataI _ ICID[0, MDataI, 32, 30, 2]; }; SelMapAdrBA _ DoGetAdrBA AND GetAdrCmdBA=RefRealAssemble; SelRPBA _ (DoGetAdrBA AND GetAdrCmdBA=VictimReal) OR SelectRPBA; SelRealDataBA _ DoRefreshBA OR SelectRealDataBA; IF PhBb THEN ForceAllDataSelectsBA _ Resetb; ENDCELL ÚCacheMCtlEntryCtl.rose Last edited by: Barth, June 21, 1984 9:10:39 pm PDT Timing and housekeeping interface Buffered timing and housekeeping interface Cell control P control <=> M control Internal main memory interface Entry Control ROM interface Control steel wool Intermediate values, not actual state bits The next block of code assumes that the instructions have been set to none and only sets the instructions if a strength other than none is to be applied. Ê7˜Jšœ™Jšœ3™3J˜J˜Jšœ!˜!Jšœ˜J™šœÏkœ˜J˜šœ!™!Jšœ œ˜Jšœ œ˜J™—šœ*™*Jšœ œ˜Jšœœ˜ J˜—™ Jšœ<œœ˜DJšœœœ˜ JšœPœœ˜XJšœœ˜Jšœœ˜Jšœ$œ˜)J™—™Jšœ œ˜J˜—šœ™Jšœœ˜J˜—™Jšœ„œ˜‰J˜—™Jšœ0˜0Jšœ&˜+Jšœ ˜—Jšœ˜J˜˜Jšœ œ˜)Jšœœ˜'Jšœ œ˜%Jšœ.˜.Jšœ œ˜™*Jšœ˜——˜ J˜šÏnœœœœ˜SJšœ œœœ˜AJšœ œœœ˜CJ˜J˜—šœ˜Jšœœœœ˜7Jš œœœœœ˜=Jš œœœœœ˜?Jš œœœœœ˜=Jš œœœœœ˜?Jš œœœœœ˜=Jš œœœœœ˜?Jš œ œœœœ˜5Jš œ œœœœ˜7Jš œ œœœœ˜7Jš œ œœœœ˜9Jš œ œœœœ˜7Jš œ œœœœ˜9Jšœ˜—J˜Jšœ™™™J™JšœœD˜NJ˜šœœœ˜JšœBœ˜IJšœBœ˜IJšœBœ˜IJšœ6œ˜=Jšœ6œ˜=Jšœ2œ˜9J˜—Jšœ œ7œ˜Ošœœ˜JšœR˜RJšœR˜RJ˜—šœ œ˜Jšœœ˜&Jšœœ˜&J˜—JšœœCœ˜_šœ œ˜JšœBœ˜HJšœBœ˜HJšœBœ ˜QJšœ6œ˜=JšœE˜EJšœ2œ˜8J˜—Jšœœ7œ˜RJ˜šœœ˜Jšœ ˜ Jšœ˜Jšœ&˜&J˜—J˜Jšœœ%œ˜FJšœœ#œ˜AJ˜Jšœœ3˜=Jšœœ˜6šœ œ˜šœœœ˜'Jšœœ˜Jšœ˜J˜—š˜Jšœœ˜ —Jšœ˜—š œœœ œ˜1šœœœ˜'Jšœœœ˜9Jšœ˜J˜—Jšœ˜—J˜Jšœœ)˜EJšœœœ*œ˜dJšœœ0˜:Jšœœ œ%˜OJšœœC˜Mšœ œ˜Jšœ œ&˜6šœ œœ˜3J˜J˜J˜J˜Jšœœ˜—J˜—Jšœ œ˜ Jšœœ˜šœœ˜Jšœ ˜ šœ œ˜šœœœ˜'Jšœ œœ ˜Jšœ˜J˜—Jšœ˜—J˜—Jšœœ2˜Jšœœ œ˜<šœœ œ ˜8J˜J˜J˜J˜Jšœœ˜—J˜JšœœC˜MJšœœ œ)˜Sšœœ˜%Jšœ œ)˜6Jšœ œ˜$J˜—Jšœœ˜9Jšœœœ ˜@Jšœœ˜0Jšœœ ˜,—Jš˜—J˜—…—¢ ³