Skip to content

Commit cceed08

Browse files
committed
edits
1 parent 98700ab commit cceed08

File tree

2 files changed

+153
-116
lines changed

2 files changed

+153
-116
lines changed

gibbon-compiler/src/Gibbon/L3/Syntax.hs

Lines changed: 123 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,15 @@ module Gibbon.L3.Syntax
1414

1515
-- * Functions
1616
, eraseLocMarkers, mapMExprs, cursorizeTy, toL3Prim, updateAvailVars
17-
17+
, getCursorizeTyFromLocVar
18+
, getCursorizeTyFromLocVar'
19+
, getCursorizeTyFromLocVar''
20+
, getCursorizeTyFromLocVar'''
21+
, getCursorizeTyFromRegVar
22+
, getCursorizeTyFromRegVar'
23+
, getCursorizeTyFromRegVar''
24+
, getCursorizeTyFromRegVar'''
25+
, getIndexPositionOfSoALocVar
1826
, module Gibbon.Language
1927
)
2028
where
@@ -298,6 +306,119 @@ scalarToTy SymS = SymTy
298306
scalarToTy BoolS = BoolTy
299307

300308

309+
getIndexPositionOfSoALocVar :: [((DataCon, Int), LocVar)] -> LocVar -> (Int, Int, Bool)
310+
getIndexPositionOfSoALocVar flds loc = foldl (\(s, e, b) (_, fl) -> if b
311+
then
312+
(s, e, True)
313+
else
314+
let seen = if fl == loc then True else False
315+
in case fl of
316+
Single{} -> (e, e + 1, seen)
317+
SoA{} -> let (CursorArrayTy sz) = getCursorizeTyFromLocVar fl
318+
in (e, e + sz, seen)
319+
) (1, 1, False) flds
320+
321+
322+
getCursorizeTyFromLocVar :: LocVar -> Ty3
323+
getCursorizeTyFromLocVar lc = case lc of
324+
Single{} -> CursorTy
325+
SoA _ flds -> let size_flds = foldr (\(_, flc) len -> case flc of
326+
Single{} -> len + 1
327+
SoA{} -> let ty3 = getCursorizeTyFromLocVar flc
328+
in case ty3 of
329+
CursorArrayTy sz -> len + sz
330+
_ -> error "Did not expect type!"
331+
) 0 flds
332+
in CursorArrayTy (1 + size_flds)
333+
334+
getCursorizeTyFromRegVar :: RegVar -> Ty3
335+
getCursorizeTyFromRegVar rv = case rv of
336+
SingleR{} -> CursorTy
337+
SoARv _ flds -> let size_flds = foldr (\(_, flr) len -> case flr of
338+
SingleR{} -> len + 1
339+
SoARv{} -> let ty3 = getCursorizeTyFromRegVar flr
340+
in case ty3 of
341+
CursorArrayTy sz -> len + sz
342+
_ -> error "Did not expect type!"
343+
) 0 flds
344+
in CursorArrayTy (1 + size_flds)
345+
346+
347+
getCursorizeTyFromLocVar' :: LocVar -> L2.Ty2
348+
getCursorizeTyFromLocVar' lc = case lc of
349+
Single{} -> L2.MkTy2 CursorTy
350+
SoA _ flds -> let size_flds = foldr (\(_, flc) len -> case flc of
351+
Single{} -> len + 1
352+
SoA{} -> let ty3 = getCursorizeTyFromLocVar flc
353+
in case ty3 of
354+
CursorArrayTy sz -> len + sz
355+
_ -> error "Did not expect type!"
356+
) 0 flds
357+
in L2.MkTy2 $ CursorArrayTy (1 + size_flds)
358+
359+
getCursorizeTyFromRegVar' :: RegVar -> L2.Ty2
360+
getCursorizeTyFromRegVar' rv = case rv of
361+
SingleR{} -> L2.MkTy2 CursorTy
362+
SoARv _ flds -> let size_flds = foldr (\(_, flr) len -> case flr of
363+
SingleR{} -> len + 1
364+
SoARv{} -> let ty3 = getCursorizeTyFromRegVar flr
365+
in case ty3 of
366+
CursorArrayTy sz -> len + sz
367+
_ -> error "Did not expect type!"
368+
) 0 flds
369+
in L2.MkTy2 $ CursorArrayTy (1 + size_flds)
370+
371+
372+
getCursorizeTyFromLocVar'' :: LocVar -> UrTy loc
373+
getCursorizeTyFromLocVar'' lc = case lc of
374+
Single{} -> CursorTy
375+
SoA _ flds -> let size_flds = foldr (\(_, flc) len -> case flc of
376+
Single{} -> len + 1
377+
SoA{} -> let ty3 = getCursorizeTyFromLocVar flc
378+
in case ty3 of
379+
CursorArrayTy sz -> len + sz
380+
_ -> error "Did not expect type!"
381+
) 0 flds
382+
in CursorArrayTy (1 + size_flds)
383+
384+
getCursorizeTyFromRegVar'' :: RegVar -> UrTy loc
385+
getCursorizeTyFromRegVar'' rv = case rv of
386+
SingleR{} -> CursorTy
387+
SoARv _ flds -> let size_flds = foldr (\(_, flr) len -> case flr of
388+
SingleR{} -> len + 1
389+
SoARv{} -> let ty3 = getCursorizeTyFromRegVar flr
390+
in case ty3 of
391+
CursorArrayTy sz -> len + sz
392+
_ -> error "Did not expect type!"
393+
) 0 flds
394+
in CursorArrayTy (1 + size_flds)
395+
396+
397+
getCursorizeTyFromLocVar''' :: LocVar -> UrTy ()
398+
getCursorizeTyFromLocVar''' lc = case lc of
399+
Single{} -> CursorTy
400+
SoA _ flds -> let size_flds = foldr (\(_, flc) len -> case flc of
401+
Single{} -> len + 1
402+
SoA{} -> let ty3 = getCursorizeTyFromLocVar flc
403+
in case ty3 of
404+
CursorArrayTy sz -> len + sz
405+
_ -> error "Did not expect type!"
406+
) 0 flds
407+
in CursorArrayTy (1 + size_flds)
408+
409+
getCursorizeTyFromRegVar''' :: RegVar -> UrTy ()
410+
getCursorizeTyFromRegVar''' rv = case rv of
411+
SingleR{} -> CursorTy
412+
SoARv _ flds -> let size_flds = foldr (\(_, flr) len -> case flr of
413+
SingleR{} -> len + 1
414+
SoARv{} -> let ty3 = getCursorizeTyFromRegVar flr
415+
in case ty3 of
416+
CursorArrayTy sz -> len + sz
417+
_ -> error "Did not expect type!"
418+
) 0 flds
419+
in CursorArrayTy (1 + size_flds)
420+
421+
301422
-----------------------------------------------------------------------------------------
302423
-- Do this manually to get prettier formatting: (Issue #90)
303424

@@ -322,9 +443,7 @@ cursorizeTy ty =
322443
ProdTy ls -> ProdTy $ L.map cursorizeTy ls
323444
SymDictTy v _ -> SymDictTy v CursorTy
324445
PDictTy k v -> PDictTy (cursorizeTy k) (cursorizeTy v)
325-
PackedTy _ l -> case l of
326-
Single _ -> ProdTy [CursorTy, CursorTy]
327-
SoA _ flds -> ProdTy [CursorArrayTy (1 + length flds), CursorArrayTy (1 + length flds)]
446+
PackedTy _ l -> ProdTy [getCursorizeTyFromLocVar'' l, getCursorizeTyFromLocVar'' l]
328447
VectorTy el_ty' -> VectorTy $ cursorizeTy el_ty'
329448
ListTy el_ty' -> ListTy $ cursorizeTy el_ty'
330449
PtrTy -> PtrTy

0 commit comments

Comments
 (0)