module CacheSim.AccessView exposing (..) import CacheSim.Cache exposing (..) import CacheSim.Hierarchy exposing (..) type AccessPosition = Down Int | Up Int | Preview | End type alias AccessView = { initialState : CacheHierarchy , blockAddr : BlockAddr , accessEffects : List (AccessEffect Cache) , position : AccessPosition } accessPositionForward : Int -> AccessPosition -> AccessPosition accessPositionForward depth av = case av of Down n -> if n == depth - 1 then Up n else Down (n + 1) Up n -> if n == 0 then Preview else Up (n - 1) Preview -> End End -> End accessPositionBack : Int -> AccessPosition -> AccessPosition accessPositionBack depth av = case av of Down 0 -> Down 0 Down n -> Down (n-1) Up n -> if n == (depth - 1) then Down n else Up (n + 1) Preview -> Up 0 End -> Preview accessPositionDone : AccessPosition -> Bool accessPositionDone av = case av of End -> True _ -> False accessViewForward : AccessView -> AccessView accessViewForward av = { av | position = accessPositionForward (List.length av.accessEffects) av.position } accessViewBack : AccessView -> AccessView accessViewBack av = { av | position = accessPositionBack (List.length av.accessEffects) av.position } accessViewDone : AccessView -> Bool accessViewDone av = accessPositionDone av.position finalCacheHierarchy : AccessView -> CacheHierarchy finalCacheHierarchy av = List.map .output av.accessEffects ++ List.drop (List.length av.accessEffects) av.initialState effectiveCacheHierarchy : AccessView -> CacheHierarchy effectiveCacheHierarchy av = let finalContents = List.map .output av.accessEffects unaccessed = List.drop (List.length av.accessEffects) av.initialState notDone = case av.position of Preview -> [] End -> [] Down _ -> List.take (List.length av.accessEffects) av.initialState Up n -> List.take n av.initialState done = case av.position of Preview -> finalContents End -> finalContents Down _ -> [] Up n -> List.drop n finalContents in notDone ++ done ++ unaccessed