<> <> <> Imports BitOps, BitSwOps, CacheOps, Dragon; Open BitOps, BitSwOps, Dragon; CELLTYPE "MRAMDriver" PORTS[ <> Vdd, Gnd> nPhBb> PBitsB, nPBitsB=SWITCH[132]-(Special XPhobic), MBitsA, nMBitsA=SWITCH[132]-(Special XPhobic), <<>> <

M control>> PAdr2831AB> MDataI=INT[32], MParityI=BOOL, <> DriveMBitsA, DriveMBitsNoMatchA, SenseMBitsA, DriveMDataIA, SenseMDataIB, DrivePBitsB, SensePBitsB> MatchRealQuadABBOOL ] State MRAMReg: BitDWord, MRAMRegParity: BOOL EvalSimple Assert[NOT MoreThanOneOf[DriveMBitsA, SenseMBitsA]]; Assert[NOT MoreThanOneOf[DriveMDataIA, SenseMDataIB]]; Assert[NOT MoreThanOneOf[DrivePBitsB, SensePBitsB]]; Assert[NOT MoreThanOneOf[SenseMBitsA, SenseMDataIB, SensePBitsB]]; TRUSTED { offset: CARDINAL _ ECFW[MAdr3031BA, 2, 0, 2]; mbitd: SwitchMWord _ DESCRIPTOR[MBitsA]; nmbitd: SwitchMWord _ DESCRIPTOR[nMBitsA]; IF SenseMDataIB THEN { MRAMReg _ MDataI; MRAMRegParity _ MParityI; }; CacheOps.DriveBus[mbitd, nmbitd, DriveMBitsA OR (DriveMBitsNoMatchA AND NOT MatchRealQuadAB), offset, MRAMReg, MRAMRegParity]; IF NOT nPhBb THEN { FOR j:CARDINAL IN [0..4) DO SCDTS[BitDWordOnes, 32, 0, 32, mbitd, 132, j*32, 32, [[none, X], [drive, H]]]; SCDTS[BitDWordOnes, 32, 0, 32, nmbitd, 132, j*32, 32, [[none, X], [drive, H]]]; ENDLOOP; SCWTS[BitWordOnes, 16, 0, 4, mbitd, 132, 128, 4, [[none, X], [drive, H]]]; SCWTS[BitWordOnes, 16, 0, 4, nmbitd, 132, 128, 4, [[none, X], [drive, H]]]; }; IF SenseMBitsA THEN { FOR i:CARDINAL IN [0..32) DO MRAMReg _ IBID[EBFS[mbitd, 132, (4*i)+offset], MRAMReg, 32, i]; ENDLOOP; MRAMRegParity _ EBFS[mbitd, 132, 128+offset]; }; }; IF DriveMDataIA OR MDataDriveDelayedA THEN { MDataI _ MRAMReg; MParityI _ MRAMRegParity; }; TRUSTED { offset: CARDINAL _ ECFW[PAdr2831AB, 4, 2, 2]; pbitd: SwitchMWord _ DESCRIPTOR[PBitsB]; npbitd: SwitchMWord _ DESCRIPTOR[nPBitsB]; CacheOps.DriveBus[pbitd, npbitd, DrivePBitsB, offset, MRAMReg, MRAMRegParity]; IF SensePBitsB THEN { FOR i:CARDINAL IN [0..32) DO MRAMReg _ IBID[EBFS[pbitd, 132, (4*i)+offset], MRAMReg, 32, i]; ENDLOOP; MRAMRegParity _ EBFS[pbitd, 132, 128+offset]; }; }; MRamRegParityOut _ CacheOps.Parity32[LOOPHOLE[MRAMReg]]; IF MRAMRegParity THEN MRamRegParityOut _ NOT MRamRegParityOut; ENDCELLTYPE