83 lines
2.6 KiB
Haskell
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 =
|
|
--}
|