@@ -10,8 +10,12 @@ import Data.HVect
11||| An universe of C types.
11||| An universe of C types.
12data CType = I8 | I16 | I32 | I64 | FLOAT | DOUBLE | PTR
12data CType = I8 | I16 | I32 | I64 | FLOAT | DOUBLE | PTR
13− | ARRAY Int CType | STRUCT (List CType) | UNION (List CType)
14+data Composite = T CType | ARRAY Int Composite | STRUCT (List Composite) | UNION (List Composite)
14− | PACKEDSTRUCT (List CType)
15+ | PACKEDSTRUCT (List Composite)
17+implicit mkComposite : CType -> Composite
16Show CType where
20Show CType where
17 show I8 = "I8"
21 show I8 = "I8"
@@ -21,6 +25,9 @@ Show CType where
21 show FLOAT = "FLOAT"
25 show FLOAT = "FLOAT"
22 show DOUBLE = "DOUBLE"
26 show DOUBLE = "DOUBLE"
23 show PTR = "PTR"
27 show PTR = "PTR"
30+ show (T ct) = show ct
24 show (ARRAY n t) = "ARRAY " ++ show n ++ " " ++ show t
31 show (ARRAY n t) = "ARRAY " ++ show n ++ " " ++ show t
25 show (STRUCT xs) = "STRUCT " ++ show xs
32 show (STRUCT xs) = "STRUCT " ++ show xs
26 show (UNION xs) = "UNION " ++ show xs
33 show (UNION xs) = "UNION " ++ show xs
@@ -34,10 +41,13 @@ translate I64 = Bits64
34translate FLOAT = Double
41translate FLOAT = Double
35translate DOUBLE = Double
42translate DOUBLE = Double
36translate PTR = Ptr
43translate PTR = Ptr
45+translateComp : Composite -> Type
46+translateComp (T ct) = translate ct
37−translate (ARRAY n t) = Vect (toNat n) (translate t)
47+translateComp (ARRAY n t) = Vect (toNat n) (translateComp t)
38−translate (STRUCT xs) = HVect $ fromList (map translate xs)
48+translateComp (STRUCT xs) = HVect $ fromList (map translateComp xs)
39−translate (UNION xs) = HVect $ fromList (map translate xs)
49+translateComp (UNION xs) = HVect $ fromList (map translateComp xs)
40−translate (PACKEDSTRUCT xs) = HVect $ fromList (map translate xs)
50+translateComp (PACKEDSTRUCT xs) = HVect $ fromList (map translateComp xs)
43 sizeOf : CType -> Int
53 sizeOf : CType -> Int
@@ -48,10 +58,13 @@ mutual
48 sizeOf FLOAT = 4
58 sizeOf FLOAT = 4
49 sizeOf DOUBLE = 8
59 sizeOf DOUBLE = 8
50 sizeOf PTR = prim__sizeofPtr
60 sizeOf PTR = prim__sizeofPtr
51− sizeOf (ARRAY n t) = n * sizeOf t
61+
62+ sizeOfComp : Composite -> Int
63+ sizeOfComp (T ct) = sizeOf ct
64+ sizeOfComp (ARRAY n t) = n * sizeOfComp t
52− sizeOf (STRUCT xs) = sizeOfStruct xs
65+ sizeOfComp (STRUCT xs) = sizeOfStruct xs
53− sizeOf (UNION xs) = foldl (\acc, x =>max acc $ sizeOf x) 0 xs
66+ sizeOfComp (UNION xs) = foldl (\acc, x =>max acc $ sizeOfComp x) 0 xs
54− sizeOf (PACKEDSTRUCT xs) = foldl (\acc, x => acc + sizeOf x) 0 xs
67+ sizeOfComp (PACKEDSTRUCT xs) = foldl (\acc, x => acc + sizeOfComp x) 0 xs
56 alignOf : CType -> Int
69 alignOf : CType -> Int
57 alignOf I8 = 1
70 alignOf I8 = 1
@@ -61,64 +74,67 @@ mutual
61 alignOf FLOAT = 4
74 alignOf FLOAT = 4
62 alignOf DOUBLE = prim__sizeofPtr
75 alignOf DOUBLE = prim__sizeofPtr
63 alignOf PTR = prim__sizeofPtr
76 alignOf PTR = prim__sizeofPtr
64− alignOf (ARRAY n t) = alignOf t
65− alignOf (STRUCT xs) = foldl (\acc, x => max acc $ alignOf x) 0 xs
66− alignOf (UNION xs) = foldl (\acc, x => max acc $ alignOf x) 0 xs
67− alignOf (PACKEDSTRUCT xs) = 1
78+ alignOfComp : Composite -> Int
79+ alignOfComp (T t) = alignOf t
80+ alignOfComp (ARRAY n t) = alignOfComp t
81+ alignOfComp (STRUCT xs) = foldl (\acc, x => max acc $ alignOfComp x) 0 xs
82+ alignOfComp (UNION xs) = foldl (\acc, x => max acc $ alignOfComp x) 0 xs
83+ alignOfComp (PACKEDSTRUCT xs) = 1
69− offsetsStruct : List CType -> List Int
85+ offsetsStruct : List Composite -> List Int
70 offsetsStruct xs = offsets' xs [] 0
86 offsetsStruct xs = offsets' xs [] 0
72− offsets' : List CType -> List Int -> Int -> List Int
88+ offsets' : List Composite -> List Int -> Int -> List Int
73 offsets' [] acc _ = reverse acc
89 offsets' [] acc _ = reverse acc
74− offsets' (x::xs) ys curr = let a = alignOf x
90+ offsets' (x::xs) ys curr = let a = alignOfComp x
75 padding = let c = curr `mod` a
91 padding = let c = curr `mod` a
76 in if c == 0 then 0 else a - c
92 in if c == 0 then 0 else a - c
77 off = curr + padding
93 off = curr + padding
78− in offsets' xs (off::ys) (off + sizeOf x)
94+ in offsets' xs (off::ys) (off + sizeOfComp x)
80− sizeOfStruct : List CType -> Int
96+ sizeOfStruct : List Composite -> Int
81 sizeOfStruct xs = case (reverse xs, reverse (offsetsStruct xs)) of
97 sizeOfStruct xs = case (reverse xs, reverse (offsetsStruct xs)) of
82 ([], _) => 0
98 ([], _) => 0
83− (x::_, y::_) => let end = y + sizeOf x
99+ (x::_, y::_) => let end = y + sizeOfComp x
84 endPadding = let c = end `mod` align in
100 endPadding = let c = end `mod` align in
85 if c == 0 then 0 else align - c
101 if c == 0 then 0 else align - c
86 in end + endPadding
102 in end + endPadding
88 align : Int
104 align : Int
89− align = foldl (\acc, x => max acc $ alignOf x) 1 xs
105+ align = foldl (\acc, x => max acc $ alignOfComp x) 1 xs
91−fields : CType -> Nat
107+fields : Composite -> Nat
92fields (STRUCT xs) = length xs
108fields (STRUCT xs) = length xs
93fields (PACKEDSTRUCT xs) = length xs
109fields (PACKEDSTRUCT xs) = length xs
94fields (UNION xs) = length xs
110fields (UNION xs) = length xs
95fields (ARRAY n _) = toNat n
111fields (ARRAY n _) = toNat n
96fields _ = 1
112fields _ = 1
98−offsetsPacked : List CType -> List Int
114+offsetsPacked : List Composite -> List Int
99offsetsPacked xs = offsets' xs [] 0
115offsetsPacked xs = offsets' xs [] 0
101− offsets' : List CType -> List Int -> Int -> List Int
117+ offsets' : List Composite -> List Int -> Int -> List Int
102 offsets' [] acc _ = reverse acc
118 offsets' [] acc _ = reverse acc
103− offsets' (x::xs) acc pos = offsets' xs (pos::acc) (sizeOf x)
119+ offsets' (x::xs) acc pos = offsets' xs (pos::acc) (sizeOfComp x)
105-- TODO: Use index and fix upp proofs.
121-- TODO: Use index and fix upp proofs.
106−offset : CType -> Nat -> Int
122+offset : Composite -> Nat -> Int
107offset (STRUCT xs) i = fromMaybe 0 $ index' i (offsetsStruct xs)
123offset (STRUCT xs) i = fromMaybe 0 $ index' i (offsetsStruct xs)
108offset (PACKEDSTRUCT xs) i = fromMaybe 0 $ index' i (offsetsPacked xs)
124offset (PACKEDSTRUCT xs) i = fromMaybe 0 $ index' i (offsetsPacked xs)
109−offset (ARRAY _ t) i = sizeOf t * toIntNat i
125+offset (ARRAY _ t) i = sizeOfComp t * toIntNat i
110offset _ _ = 0
126offset _ _ = 0
112−offsets : CType -> List Int
128+offsets : Composite -> List Int
113offsets (STRUCT xs) = offsetsStruct xs
129offsets (STRUCT xs) = offsetsStruct xs
114offsets (PACKEDSTRUCT xs) = offsetsPacked xs
130offsets (PACKEDSTRUCT xs) = offsetsPacked xs
115offsets (UNION xs) = replicate (length xs) 0
131offsets (UNION xs) = replicate (length xs) 0
116−offsets (ARRAY n t) = [ x*sizeOf t | x <- [0..n-1]]
132+offsets (ARRAY n t) = [ x*sizeOfComp t | x <- [0..n-1]]
117offsets _ = [0]
133offsets _ = [0]
119-- TODO: handle out of bounds with proofs
135-- TODO: handle out of bounds with proofs
120-- Also choose a better name.
136-- Also choose a better name.
121−select : CType -> Nat -> CType
137+select : Composite -> Nat -> Composite
122select (STRUCT xs@(y::_)) i = fromMaybe y (index' i xs)
138select (STRUCT xs@(y::_)) i = fromMaybe y (index' i xs)
123select (PACKEDSTRUCT xs@(y::_)) i = fromMaybe y (index' i xs)
139select (PACKEDSTRUCT xs@(y::_)) i = fromMaybe y (index' i xs)
124select (UNION xs@(y::_)) i = fromMaybe y (index' i xs)
140select (UNION xs@(y::_)) i = fromMaybe y (index' i xs)