CacheMCAMDriver.rose
Last edited by: Barth, April 30, 1984 4:13:02 pm PDT
Imports BitOps, BitSwOps, Dragon;
Open BitOps, BitSwOps, Dragon;
MCAMDriver: CELL[
Timing and housekeeping interface
Vdd, Gnd<BOOL,
LatchBias<BOOL,
CAM interface
VirtualPage<INT[24],
VirtualBlock<INT[6],
RealPage, nRealPage>INT[24],
RealBlock, nRealBlock>INT[6],
CAMPageAccess, nCAMPageAccess=SWITCH[24]-S-X,
CAMBlockAccess, nCAMBlockAccess=SWITCH[6]-S-X,
Debug interface
ShiftDataToPCAM>BOOL,
Internal main memory interface
MDataI=INT[32],
More debug interface
ShiftDataToMCAM<BOOL,
ShiftEqual, nShiftEqual, ShiftFeedBack, nShiftFeedBack, ShiftShift, nShiftShift<BOOL,
MCAMDriver interface
PageAccessToAccess, BlockAccessToAccess<BOOL,
PageVirtualToAccess, BlockVirtualToAccess<BOOL,
MatchToAccess<BOOL,
MDataToMatch, AccessToMatch<BOOL,
PageAccessToMData, nPageAccessToMData<BOOL,
BlockAccessToMData, nBlockAccessToMData<BOOL,
AccessToPageBlockAccess, nAccessToPageBlockAccess, ShiftToPageBlockAccess, nShiftToPageBlockAccess, AccessDrive, nAccessDrive<BOOL,
PageBlockAccessToShift, nPageBlockAccessToShift<BOOL,
nCAMAccessPrecharge<BOOL
]
State
pageAccess, pageMatch: BitDWord,
blockAccess, blockMatch: BitWord,
shiftData, nShiftData: BitDWord
EvalSimple
Assert[NOT MoreThanOneOf[ShiftFeedBack, nShiftFeedBack]];
Assert[NOT MoreThanOneOf[ShiftEqual, nShiftEqual]];
Assert[NOT MoreThanOneOf[ShiftShift, nShiftShift]];
Assert[NOT MoreThanOneOf[BlockAccessToAccess, BlockVirtualToAccess, MatchToAccess]];
Assert[NOT MoreThanOneOf[PageAccessToAccess, PageVirtualToAccess, MatchToAccess]];
Assert[NOT MoreThanOneOf[MDataToMatch, AccessToMatch]];
Assert[NOT MoreThanOneOf[PageAccessToMData, nPageAccessToMData]];
Assert[NOT MoreThanOneOf[BlockAccessToMData, nBlockAccessToMData]];
Assert[NOT MoreThanOneOf[AccessToPageBlockAccess, nAccessToPageBlockAccess]];
Assert[NOT MoreThanOneOf[ShiftToPageBlockAccess, nShiftToPageBlockAccess]];
Assert[NOT MoreThanOneOf[AccessDrive, nAccessDrive]];
Assert[NOT MoreThanOneOf[AccessToPageBlockAccess, ShiftToPageBlockAccess]];
Assert[NOT MoreThanOneOf[PageBlockAccessToShift, nPageBlockAccessToShift]];
Assert[NOT MoreThanOneOf[NOT nCAMAccessPrecharge, AccessDrive]];
Assert[NOT AccessDrive OR (AccessToPageBlockAccess OR ShiftToPageBlockAccess)];
IF MatchToAccess THEN {
pageAccess ← pageMatch;
blockAccess ← blockMatch;
};
IF MDataToMatch THEN {
pageMatch ← MDTD[MDataI, 32, 0, 24, pageMatch, 24, 0, 24];
blockMatch ← MDTW[MDataI, 32, 24, 6, blockMatch, 6, 0, 6];
};
IF PageVirtualToAccess THEN pageAccess ← VirtualPage;
IF BlockVirtualToAccess THEN blockAccess ← VirtualBlock;
TRUSTED {
cpd: SwitchMWord ← DESCRIPTOR[CAMPageAccess];
ncpd: SwitchMWord ← DESCRIPTOR[nCAMPageAccess];
cbd: SwitchMWord ← DESCRIPTOR[CAMBlockAccess];
ncbd: SwitchMWord ← DESCRIPTOR[nCAMBlockAccess];
s: SwitchTypes.Strength ← IF AccessDrive THEN driveStrong ELSE none;
pData: BitDWord;
bData: BitWord;
IF PageAccessToAccess THEN pageAccess ← CSTD[cpd, 24, 0, 24, pageAccess, 24, 0, 24];
IF BlockAccessToAccess THEN blockAccess ← CSTW[cbd, 6, 0, 6, blockAccess, 6, 0, 6];
IF AccessToPageBlockAccess THEN {
pData ← pageAccess;
bData ← blockAccess;
}
ELSE { -- assume that ShiftToPageBlockAccess is asserted
pData ← MDTD[shiftData, 30, 0, 24, pData, 24, 0, 24];
bData ← MDTW[shiftData, 30, 24, 6, bData, 6, 0, 6];
};
SCDTS[pData, 24, 0, 24, cpd, 24, 0, 24, [[s, L], [s, H]]];
SCDTS[pData, 24, 0, 24, ncpd, 24, 0, 24, [[s, H], [s, L]]];
SCWTS[bData, 6, 0, 6, cbd, 6, 0, 6, [[s, L], [s, H]]];
SCWTS[bData, 6, 0, 6, ncbd, 6, 0, 6, [[s, H], [s, L]]];
IF PageBlockAccessToShift THEN {
sData: BitDWord ← CSTD[cpd, 24, 0, 24, BitDWordZero, 30, 0, 24];
sData ← CSTD[cbd, 6, 0, 6, sData, 30, 24, 6];
nShiftData ← DNOT[sData, 30];
};
IF NOT nCAMAccessPrecharge THEN {
SCDTS[BitDWordOnes, 24, 0, 24, cpd, 24, 0, 24, [[none, X], [drive, H]]];
SCDTS[BitDWordOnes, 24, 0, 24, ncpd, 24, 0, 24, [[none, X], [drive, H]]];
SCWTS[BitWordOnes, 6, 0, 6, cbd, 6, 0, 6, [[none, X], [drive, H]]];
SCWTS[BitWordOnes, 6, 0, 6, ncbd, 6, 0, 6, [[none, X], [drive, H]]];
};
};
IF PageAccessToMData THEN MDataI ← MDTD[pageAccess, 24, 0, 24, MDataI, 32, 0, 24];
IF BlockAccessToMData THEN MDataI ← MWTD[blockAccess, 6, 0, 6, MDataI, 32, 24, 6];
IF AccessToMatch THEN {
pageMatch ← pageAccess;
blockMatch ← blockAccess;
};
RealPage ← pageMatch;
nRealPage ← DNOT[pageMatch, 24];
RealBlock ← blockMatch;
nRealBlock ← WNOT[blockMatch, 6];
IF ShiftShift THEN {
nShiftData ← MDTD[DNOT[shiftData, 30], 30, 1, 29, nShiftData, 30, 0, 29];
nShiftData ← IBID[NOT ShiftDataToMCAM, nShiftData, 30, 29];
};
IF ShiftFeedBack THEN {
nShiftData ← MDTD[DNOT[shiftData, 30], 30, 0, 30, nShiftData, 30, 0, 30];
};
IF ShiftEqual THEN {
shiftData ← MDTD[DNOT[nShiftData, 30], 30, 0, 30, shiftData, 30, 0, 30];
ShiftDataToPCAM ← EBFD[shiftData, 30, 0];
};
ENDCELL