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
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];
};