CacheSim/src/CacheSim/AccessView.elm

68 lines
2.2 KiB
Elm

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