68 lines
2.2 KiB
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
|