2019-05-28 19:26:02 -07:00
|
|
|
module CacheSim.View exposing (..)
|
|
|
|
import CacheSim.Raw exposing (..)
|
|
|
|
import CacheSim.Model exposing (..)
|
2019-05-28 19:49:48 -07:00
|
|
|
import Html exposing (Html, input, text, div, label, span, h2, h3)
|
2019-05-28 20:08:04 -07:00
|
|
|
import Html.Attributes exposing (type_, class, value, for, classList, disabled)
|
2019-05-28 19:49:48 -07:00
|
|
|
import Html.Events exposing (onInput, onClick)
|
|
|
|
|
2019-05-28 20:08:04 -07:00
|
|
|
optionalButton : Bool -> String -> Msg -> Html Msg
|
|
|
|
optionalButton e s m =
|
|
|
|
let
|
|
|
|
events = if e then [ onClick m ] else [ disabled (not e) ]
|
|
|
|
in
|
|
|
|
input ([ type_ "button", value s ] ++ events) []
|
|
|
|
|
2019-05-28 19:49:48 -07:00
|
|
|
button : String -> Msg -> Html Msg
|
|
|
|
button s m = input [ type_ "button", onClick m, value s] []
|
|
|
|
|
|
|
|
buttonWrapper : List (Html Msg) -> Html Msg
|
|
|
|
buttonWrapper = div [ class "button-wrapper" ]
|
2019-05-28 19:26:02 -07:00
|
|
|
|
|
|
|
labeledInput : String -> String -> (String -> Msg) -> Html Msg
|
|
|
|
labeledInput s val f =
|
|
|
|
div [ class "input-group" ]
|
|
|
|
[ span [] [ text s ]
|
|
|
|
, input [ value val, type_ "text", onInput f ] []
|
|
|
|
]
|
|
|
|
|
|
|
|
viewRawCacheModel : Int -> RawCacheModel -> Html Msg
|
|
|
|
viewRawCacheModel level rcm =
|
|
|
|
let
|
|
|
|
updateBlockSize s cm = { cm | blockSize = s}
|
|
|
|
updateSetCount s cm = { cm | setCount = s}
|
|
|
|
updateSetSize s cm = { cm | setSize = s}
|
2019-05-28 19:37:22 -07:00
|
|
|
wrapUpdate f s = ChangeRawModel level (f s)
|
2019-05-28 19:26:02 -07:00
|
|
|
|
2019-05-28 19:49:48 -07:00
|
|
|
deleteButton = button "Delete" (DeleteRawModel level)
|
|
|
|
|
2019-05-28 19:26:02 -07:00
|
|
|
params = div [ class "cache-model-params" ]
|
|
|
|
[ labeledInput "Block size" rcm.blockSize (wrapUpdate updateBlockSize)
|
|
|
|
, labeledInput "Set count" rcm.setCount (wrapUpdate updateSetCount)
|
|
|
|
, labeledInput "Set size" rcm.setSize (wrapUpdate updateSetSize)
|
|
|
|
]
|
|
|
|
in
|
|
|
|
div [ class "cache-model" ]
|
2019-05-28 19:49:48 -07:00
|
|
|
[ h3 [] [ text <| "L" ++ String.fromInt (level + 1) ++ " Cache" ]
|
|
|
|
, buttonWrapper [ deleteButton ]
|
2019-05-28 19:26:02 -07:00
|
|
|
, params
|
|
|
|
]
|
|
|
|
|
|
|
|
viewRawCacheModelHierarchy : RawCacheModelHierarchy -> Html Msg
|
|
|
|
viewRawCacheModelHierarchy rcmh =
|
2019-05-28 19:49:48 -07:00
|
|
|
let
|
|
|
|
models = div [ class "cache-model-levels" ]
|
|
|
|
<|List.indexedMap viewRawCacheModel rcmh
|
2019-05-28 20:08:04 -07:00
|
|
|
translationResult = Result.andThen validateCacheModelHierarchy
|
|
|
|
<| translateRawCacheModelHierarchy rcmh
|
|
|
|
isValid =
|
|
|
|
case translationResult of
|
|
|
|
Ok _ -> True
|
|
|
|
Err _ -> False
|
|
|
|
errorHtml =
|
|
|
|
case translationResult of
|
|
|
|
Ok _ -> viewError True ""
|
|
|
|
Err e -> viewError False e
|
2019-05-28 19:49:48 -07:00
|
|
|
|
|
|
|
newButton = button "Add level" CreateRawModel
|
2019-05-28 20:08:04 -07:00
|
|
|
useButton = optionalButton isValid "Use hierarchy" CreateRawModel
|
2019-05-28 19:49:48 -07:00
|
|
|
in
|
|
|
|
div [ class "cache-model-hierarchy" ]
|
|
|
|
[ h2 [] [ text "Cache hierarchy" ]
|
2019-05-28 20:08:04 -07:00
|
|
|
, errorHtml
|
|
|
|
, buttonWrapper [ newButton, useButton ]
|
2019-05-28 19:49:48 -07:00
|
|
|
, models
|
|
|
|
]
|
2019-05-28 20:08:04 -07:00
|
|
|
|
|
|
|
viewError : Bool -> String -> Html Msg
|
|
|
|
viewError hide e = span [ classList [ ("hidden", hide) ] ] [ text e ]
|
|
|
|
|
|
|
|
viewBase : Model -> Html Msg
|
|
|
|
viewBase m =
|
|
|
|
div [] [ viewRawCacheModelHierarchy m.rawHierarchy ]
|