Create "raw" (string-based) cache model types for user input.
This commit is contained in:
parent
5023b6c341
commit
ddfd65b099
49
src/CacheSim/Raw.elm
Normal file
49
src/CacheSim/Raw.elm
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
module CacheSim.Raw exposing (..)
|
||||||
|
import CacheSim.Cache exposing (..)
|
||||||
|
import CacheSim.Hierarchy exposing (..)
|
||||||
|
|
||||||
|
type alias RawCacheModel =
|
||||||
|
{ blockSize : String
|
||||||
|
, setCount : String
|
||||||
|
, setSize : String
|
||||||
|
}
|
||||||
|
|
||||||
|
type alias RawCacheModelHierarchy = List RawCacheModel
|
||||||
|
|
||||||
|
translateRawCacheModel : RawCacheModel -> Result String CacheModel
|
||||||
|
translateRawCacheModel rcm =
|
||||||
|
let
|
||||||
|
blockSizeInt = String.toInt rcm.blockSize
|
||||||
|
setCountInt = String.toInt rcm.setCount
|
||||||
|
setSizeInt = String.toInt rcm.setSize
|
||||||
|
in
|
||||||
|
case (blockSizeInt, setCountInt, setSizeInt) of
|
||||||
|
(Just bs, Just sc, Just ss) ->
|
||||||
|
Ok { blockSize = bs, setCount = sc, setSize = ss }
|
||||||
|
(Nothing, _, _) ->
|
||||||
|
Err <| "Unable to parse the block size: " ++ rcm.blockSize
|
||||||
|
(_, Nothing, _) ->
|
||||||
|
Err <| "Unable to parse the set count: " ++ rcm.setCount
|
||||||
|
(_, _, Nothing) ->
|
||||||
|
Err <| "Unable to parse the set size: " ++ rcm.setSize
|
||||||
|
|
||||||
|
translateRawCacheModelHierarchy : RawCacheModelHierarchy -> Result String CacheModelHierarchy
|
||||||
|
translateRawCacheModelHierarchy rcmh =
|
||||||
|
case rcmh of
|
||||||
|
[] -> Ok []
|
||||||
|
cm::cms ->
|
||||||
|
case translateRawCacheModel cm of
|
||||||
|
Ok ncm -> Result.map ((::) ncm) <| translateRawCacheModelHierarchy cms
|
||||||
|
Err e -> Err e
|
||||||
|
|
||||||
|
validateCacheModelHierarchy : CacheModelHierarchy -> Result String CacheModelHierarchy
|
||||||
|
validateCacheModelHierarchy cmh =
|
||||||
|
case cmh of
|
||||||
|
[] -> Ok []
|
||||||
|
x::[] -> Ok [x]
|
||||||
|
x::y::xs ->
|
||||||
|
if modBy y.blockSize x.blockSize == 0
|
||||||
|
then validateCacheModelHierarchy (y::xs)
|
||||||
|
else Err <| "Block cache size " ++ String.fromInt x.blockSize ++
|
||||||
|
" is not a multiple of the next level cache's" ++
|
||||||
|
" block size (" ++ String.fromInt y.blockSize ++ ")"
|
Loading…
Reference in New Issue
Block a user