diff options
author | Tom Smeding <tom@tomsmeding.com> | 2024-08-30 22:45:46 +0200 |
---|---|---|
committer | Tom Smeding <tom@tomsmeding.com> | 2024-08-30 22:45:46 +0200 |
commit | 1f7ed2ee02222108684cfde8078e7a182f734a61 (patch) | |
tree | 976175ede4ec12a6e4a65d5e45e0b1ee8eeff5e6 /src/AST.hs | |
parent | 172887fb577526de92b0653b5d3153114f8ce02a (diff) |
WIP Build1
Diffstat (limited to 'src/AST.hs')
-rw-r--r-- | src/AST.hs | 12 |
1 files changed, 12 insertions, 0 deletions
@@ -15,6 +15,7 @@ {-# LANGUAGE EmptyCase #-} module AST (module AST, module AST.Weaken) where +import Data.Bifunctor (first) import Data.Functor.Const import Data.Kind (Type) import Data.Int @@ -55,6 +56,9 @@ deriving instance Show (SScalTy t) type TIx = TScal TI64 +tIx :: STy TIx +tIx = STScal STI64 + type family ScalRep t where ScalRep TI32 = Int32 ScalRep TI64 = Int64 @@ -92,6 +96,7 @@ data Expr x env t where -- expression operations EConst :: Show (ScalRep t) => x (TScal t) -> SScalTy t -> ScalRep t -> Expr x env (TScal t) + EIdx0 :: x t -> Expr x env (TArr Z t) -> Expr x env t EIdx1 :: x (TArr n t) -> Expr x env (TArr (S n) t) -> Expr x env TIx -> Expr x env (TArr n t) EIdx :: x t -> Expr x env (TArr n t) -> Vec n (Expr x env TIx) -> Expr x env t EOp :: x t -> SOp a t -> Expr x env a -> Expr x env t @@ -150,6 +155,7 @@ typeOf = \case EFold1 _ _ e | STArr (SS n) t <- typeOf e -> STArr n t EConst _ t _ -> STScal t + EIdx0 _ e | STArr _ t <- typeOf e -> t EIdx1 _ e _ | STArr (SS n) t <- typeOf e -> STArr n t EIdx _ e _ | STArr _ t <- typeOf e -> t EOp _ op _ -> opt2 op @@ -210,6 +216,7 @@ subst' f w = \case EBuild x es e -> EBuild x (fmap (subst' f w) es) (subst' (sinkFN (vecLength es) f) (wcopyN (vecLength es) w) e) EFold1 x a b -> EFold1 x (subst' (sinkF (sinkF f)) (WCopy (WCopy w)) a) (subst' f w b) EConst x t v -> EConst x t v + EIdx0 x e -> EIdx0 x (subst' f w e) EIdx1 x a b -> EIdx1 x (subst' f w a) (subst' f w b) EIdx x e es -> EIdx x (subst' f w e) (fmap (subst' f w) es) EOp x op e -> EOp x op (subst' f w e) @@ -254,6 +261,11 @@ idx2int :: Idx env t -> Int idx2int IZ = 0 idx2int (IS n) = 1 + idx2int n +splitIdx :: forall env2 env1 t f. SList f env1 -> Idx (Append env1 env2) t -> Either (Idx env1 t) (Idx env2 t) +splitIdx SNil i = Right i +splitIdx (SCons _ _) IZ = Left IZ +splitIdx (SCons _ l) (IS i) = first IS (splitIdx l i) + class KnownScalTy t where knownScalTy :: SScalTy t instance KnownScalTy TI32 where knownScalTy = STI32 instance KnownScalTy TI64 where knownScalTy = STI64 |