<> <> <> DIRECTORY DragOpsCross USING [TrapIndex, Word], SparseMemory USING [Base]; LizardCache: CEDAR DEFINITIONS = BEGIN TrapIndex: TYPE = DragOpsCross.TrapIndex; Word: TYPE = DragOpsCross.Word; CacheBase: TYPE = REF CacheBaseRep; CacheBaseRep: TYPE = RECORD [ sharedBase: SharedBase _ NIL, -- shared base data private: REF _ NIL, -- private data to the cache implementation fetch: CacheFetchProc _ NIL, -- this hook allows the user to intercept cache accesses store: CacheStoreProc _ NIL, -- this hook allows the user to intercept cache accesses data: REF _ NIL, -- private data for clients intercepting fetch & store stats: CacheStats _ [] -- maintained by the default fetch and store routines ]; SharedBase: TYPE = REF SharedBaseRep; SharedBaseRep: TYPE = RECORD [ mem: SparseMemory.Base _ NIL, busyUntil: INT _ 0 ]; CacheFetchProc: TYPE = PROC [base: CacheBase, addr: Word, cycle: INT, noEffect: BOOL _ FALSE] RETURNS [data: Word, status: TrapIndex, rejectCycles: INT]; <> CacheStoreProc: TYPE = PROC [base: CacheBase, addr: Word, data: Word, cycle: INT] RETURNS [old: Word, status: TrapIndex, rejectCycles: INT]; <> CacheStats: TYPE = RECORD [ probes: INT _ 0, misses: INT _ 0, mapMisses: INT _ 0, dirtyWrites: INT _ 0, rejectCycles: INT _ 0 ]; NewBase: PROC [mem: SparseMemory.Base] RETURNS [SharedBase]; <> <<>> NewCache: PROC [shared: SharedBase, lines: [0..4096) _ 0] RETURNS [CacheBase]; <> ResetCache: PROC [cache: CacheBase]; <> <<>> FlushCache: PROC [cache: CacheBase]; <> Fetch: PROC [base: CacheBase, addr: Word, cycle: INT, noEffect: BOOL _ FALSE] RETURNS [data: Word, status: TrapIndex, rejectCycles: INT] = INLINE { [data, status, rejectCycles] _ base.fetch[base, addr, cycle, noEffect] }; Store: PROC [base: CacheBase, addr: Word, data: Word, cycle: INT] RETURNS [old: Word, status: TrapIndex, rejectCycles: INT] = INLINE { [old, status, rejectCycles] _ base.store[base, addr, data, cycle] }; END.