summaryrefslogtreecommitdiff
path: root/src/AST.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/AST.hs')
-rw-r--r--src/AST.hs54
1 files changed, 37 insertions, 17 deletions
diff --git a/src/AST.hs b/src/AST.hs
index af137b2..6370148 100644
--- a/src/AST.hs
+++ b/src/AST.hs
@@ -147,9 +147,11 @@ data SOp a t where
ONeg :: ScalIsNumeric a ~ True => SScalTy a -> SOp (TScal a) (TScal a)
OLt :: ScalIsNumeric a ~ True => SScalTy a -> SOp (TPair (TScal a) (TScal a)) (TScal TBool)
OLe :: ScalIsNumeric a ~ True => SScalTy a -> SOp (TPair (TScal a) (TScal a)) (TScal TBool)
- OEq :: ScalIsNumeric a ~ True => SScalTy a -> SOp (TPair (TScal a) (TScal a)) (TScal TBool)
+ OEq :: SScalTy a -> SOp (TPair (TScal a) (TScal a)) (TScal TBool)
ONot :: SOp (TScal TBool) (TScal TBool)
- OIf :: SOp (TScal TBool) (TEither TNil TNil)
+ OAnd :: SOp (TPair (TScal TBool) (TScal TBool)) (TScal TBool)
+ OOr :: SOp (TPair (TScal TBool) (TScal TBool)) (TScal TBool)
+ OIf :: SOp (TScal TBool) (TEither TNil TNil) -- True is Left, False is Right
ORound64 :: SOp (TScal TF64) (TScal TI64)
OToFl64 :: SOp (TScal TI64) (TScal TF64)
deriving instance Show (SOp a t)
@@ -163,6 +165,8 @@ opt2 = \case
OLe _ -> STScal STBool
OEq _ -> STScal STBool
ONot -> STScal STBool
+ OAnd -> STScal STBool
+ OOr -> STScal STBool
OIf -> STEither STNil STNil
ORound64 -> STScal STI64
OToFl64 -> STScal STF64
@@ -206,23 +210,23 @@ typeOf = \case
EError t _ -> t
-unSNat :: SNat n -> Nat
-unSNat SZ = Z
-unSNat (SS n) = S (unSNat n)
+-- unSNat :: SNat n -> Nat
+-- unSNat SZ = Z
+-- unSNat (SS n) = S (unSNat n)
-unSTy :: STy t -> Ty
-unSTy = \case
- STNil -> TNil
- STPair a b -> TPair (unSTy a) (unSTy b)
- STEither a b -> TEither (unSTy a) (unSTy b)
- STMaybe t -> TMaybe (unSTy t)
- STArr n t -> TArr (unSNat n) (unSTy t)
- STScal t -> TScal (unSScalTy t)
- STAccum t -> TAccum (unSTy t)
+-- unSTy :: STy t -> Ty
+-- unSTy = \case
+-- STNil -> TNil
+-- STPair a b -> TPair (unSTy a) (unSTy b)
+-- STEither a b -> TEither (unSTy a) (unSTy b)
+-- STMaybe t -> TMaybe (unSTy t)
+-- STArr n t -> TArr (unSNat n) (unSTy t)
+-- STScal t -> TScal (unSScalTy t)
+-- STAccum t -> TAccum (unSTy t)
-unSList :: SList STy env -> [Ty]
-unSList SNil = []
-unSList (SCons t l) = unSTy t : unSList l
+-- unSEnv :: SList STy env -> [Ty]
+-- unSEnv SNil = []
+-- unSEnv (SCons t l) = unSTy t : unSEnv l
unSScalTy :: SScalTy t -> ScalTy
unSScalTy = \case
@@ -335,9 +339,25 @@ sscaltyKnown STF32 = Dict
sscaltyKnown STF64 = Dict
sscaltyKnown STBool = Dict
+envKnown :: SList STy env -> Dict (KnownEnv env)
+envKnown SNil = Dict
+envKnown (t `SCons` env) | Dict <- styKnown t, Dict <- envKnown env = Dict
+
ebuildUp1 :: SNat n -> Ex env (Tup (Replicate n TIx)) -> Ex env TIx -> Ex (TIx : env) (TArr n t) -> Ex env (TArr (S n) t)
ebuildUp1 n sh size f =
EBuild ext (SS n) (EPair ext sh size) $
let arg = EVar ext (tTup (sreplicate (SS n) tIx)) IZ
in EIdx ext (ELet ext (ESnd ext arg) (weakenExpr (WCopy WSink) f))
(EFst ext arg)
+
+eidxEq :: SNat n -> Ex env (Tup (Replicate n TIx)) -> Ex env (Tup (Replicate n TIx)) -> Ex env (TScal TBool)
+eidxEq SZ _ _ = EConst ext STBool True
+eidxEq (SS n) a b
+ | let ty = tTup (sreplicate (SS n) tIx)
+ = ELet ext a $
+ ELet ext (weakenExpr WSink b) $
+ EOp ext OAnd $ EPair ext
+ (EOp ext (OEq STI64) (EPair ext (ESnd ext (EVar ext ty (IS IZ)))
+ (ESnd ext (EVar ext ty IZ))))
+ (eidxEq n (EFst ext (EVar ext ty (IS IZ)))
+ (EFst ext (EVar ext ty IZ)))