@@ -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 )
2028where
@@ -298,6 +306,119 @@ scalarToTy SymS = SymTy
298306scalarToTy 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