aos/tools/mackerel/Space.hs
Daniel Schwyn 6d444bf552 Main handout
Signed-off-by: Daniel Schwyn <daniel.schwyn@inf.ethz.ch>
2022-03-03 14:57:51 +01:00

83 lines
2.6 KiB
Haskell

{-
Space: dealing with various register address spaces
Part of Mackerel: a strawman device definition DSL for Barrelfish
Copyright (c) 2007, 2008, ETH Zurich.
All rights reserved.
This file is distributed under the terms in the attached LICENSE file.
If you do not find this file, copies can be found by writing to:
ETH Zurich D-INFK, Universitaetstrasse 6, CH-8092 Zurich. Attn: Systems Group.
-}
module Space where
import Text.ParserCombinators.Parsec
data SpaceType = BYTEWISE Integer | VALUEWISE | REGISTERWISE | UNDEF
deriving (Show, Eq)
data Rec = Builtin { n :: String,
d :: String,
t :: SpaceType }
| Defined { n :: String,
a :: [ String ],
d :: String,
devname :: String,
t :: SpaceType,
p :: SourcePos }
| UndefinedSpace
| NoSpace
deriving (Eq,Show)
make :: String -> [String] -> String -> SpaceType -> SourcePos -> Rec
make name args desc tpe pos =
Defined { n = name, a = args, d = desc, devname = "", t = tpe, p = pos }
builtins :: [ Rec ]
builtins = [ Builtin { n = "addr",
d = "Physical address space",
t = BYTEWISE 1},
Builtin { n = "io",
d = "I/O port space",
t = BYTEWISE 1},
Builtin { n = "pci",
d = "PCI configuration space",
t = BYTEWISE 1}
]
lookup :: String -> [Rec] -> Rec
lookup sn spt =
let rl = [ s | s <- spt, (n s) == sn ]
in if length rl == 0 then UndefinedSpace else head rl
is_builtin :: Rec -> Bool
is_builtin (Builtin _ _ _) = True
is_builtin _ = False
{--
data Interval = Interval RegSpace String Integer Integer
deriving Ord
make_interval_from_regloc :: RegLoc -> Integer -> Interval
make_interval_from_regloc (RegLoc space base expr) sz =
Interval space base offset size
where
offset = evaluate expr
size = if size_matters space
then size
else 1
intervals_overlap :: Interval -> Interval -> Bool
intervals_overlap (Interval sp1 b1 o1 s1) (Interval sp2 b2 o2 s2)
| sp1 != sp2 = false
| b1 != b2 = false
| (o1 <= o2) and (o1 + sz) > o2 = true
| (o2 <= o1) and (o2 + sz) > o1 = true
| otherwise = false
make_intlist_from_array :: RegLoc -> ArrayLoc -> Integer -> [ Interval ]
make_intlist_from_array (RegLoc space base expr) (ArrayListLoc l) sz =
--}