Add a "cache view" type to step through a cache access.
This commit is contained in:
parent
eebf82d40a
commit
672d321616
54
src/CacheSim/AccessView.elm
Normal file
54
src/CacheSim/AccessView.elm
Normal file
|
@ -0,0 +1,54 @@
|
|||
module CacheSim.AccessView exposing (..)
|
||||
import CacheSim.Cache exposing (..)
|
||||
import CacheSim.Hierarchy exposing (..)
|
||||
|
||||
type AccessPosition = Down Int | Up Int | Done
|
||||
type alias AccessView = (List (AccessEffect Cache), 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 Done else Up (n - 1)
|
||||
Done -> Done
|
||||
|
||||
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)
|
||||
Done -> Up 0
|
||||
|
||||
accessPositionDone : AccessPosition -> Bool
|
||||
accessPositionDone av =
|
||||
case av of
|
||||
Done -> True
|
||||
_ -> False
|
||||
|
||||
accessViewForward : AccessView -> AccessView
|
||||
accessViewForward (l, ap) = (l, accessPositionForward (List.length l) ap)
|
||||
|
||||
accessViewBack : AccessView -> AccessView
|
||||
accessViewBack (l, ap) = (l, accessPositionBack (List.length l) ap)
|
||||
|
||||
accessViewDone : AccessView -> Bool
|
||||
accessViewDone (_, ap) = accessPositionDone ap
|
||||
|
||||
effectiveCacheHierarchy : CacheHierarchy -> AccessView -> CacheHierarchy
|
||||
effectiveCacheHierarchy c (l, ap) =
|
||||
let
|
||||
finalContents = List.map .output l
|
||||
unaccessed = List.drop (List.length l) c
|
||||
notDone =
|
||||
case ap of
|
||||
Done -> []
|
||||
Down _ -> List.take (List.length l) c
|
||||
Up n -> List.take n c
|
||||
done =
|
||||
case ap of
|
||||
Done -> finalContents
|
||||
Down _ -> []
|
||||
Up n -> List.drop n finalContents
|
||||
in
|
||||
notDone ++ done ++ unaccessed
|
|
@ -1,10 +1,12 @@
|
|||
module CacheSim.Model exposing (..)
|
||||
import CacheSim.Raw exposing (..)
|
||||
import CacheSim.Hierarchy exposing (..)
|
||||
import CacheSim.AccessView exposing (..)
|
||||
|
||||
type alias Model =
|
||||
{ rawHierarchy : RawCacheModelHierarchy
|
||||
, hierarchy : Maybe CacheHierarchy
|
||||
, accessView : Maybe AccessView
|
||||
}
|
||||
type alias Flags = ()
|
||||
type Msg
|
||||
|
@ -12,3 +14,4 @@ type Msg
|
|||
| CreateRawModel
|
||||
| DeleteRawModel Int
|
||||
| UseHierarchy (Maybe CacheModelHierarchy)
|
||||
| Access Int
|
||||
|
|
|
@ -3,6 +3,7 @@ import CacheSim.Model exposing (..)
|
|||
import CacheSim.Hierarchy exposing (..)
|
||||
import CacheSim.Raw exposing (..)
|
||||
import CacheSim.IntMap exposing (..)
|
||||
import CacheSim.AccessView exposing (..)
|
||||
|
||||
updateChangeRawModel : Int -> (RawCacheModel -> RawCacheModel) -> Model -> (Model, Cmd Msg)
|
||||
updateChangeRawModel l f m =
|
||||
|
@ -36,3 +37,12 @@ updateUseHierarchy cmh m =
|
|||
cmd = Cmd.none
|
||||
in
|
||||
(newModel, cmd)
|
||||
|
||||
updateAccess : Int -> Model -> (Model, Cmd Msg)
|
||||
updateAccess i m =
|
||||
let
|
||||
accessResult = Maybe.map (accessCacheHierarchy i) m.hierarchy
|
||||
newModel = m
|
||||
cmd = Cmd.none
|
||||
in
|
||||
(newModel, cmd)
|
||||
|
|
|
@ -18,6 +18,7 @@ init f =
|
|||
initialModel =
|
||||
{ rawHierarchy = testCacheModelHierarchy
|
||||
, hierarchy = Nothing
|
||||
, accessView = Nothing
|
||||
}
|
||||
in
|
||||
(initialModel, Cmd.none)
|
||||
|
@ -35,6 +36,7 @@ update msg m =
|
|||
CreateRawModel -> updateCreateRawModel m
|
||||
DeleteRawModel i -> updateDeleteRawModel i m
|
||||
UseHierarchy cmh -> updateUseHierarchy cmh m
|
||||
Access i -> updateAccess i m
|
||||
|
||||
subscriptions : Model -> Sub Msg
|
||||
subscriptions m = Sub.none
|
||||
|
|
Loading…
Reference in New Issue
Block a user