diff options
Diffstat (limited to 'src/AST.hs')
-rw-r--r-- | src/AST.hs | 54 |
1 files changed, 37 insertions, 17 deletions
@@ -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))) |