kempe 0.2.0.3 → 0.2.0.4
raw patch · 12 files changed
+82/−82 lines, 12 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
+ Kempe.AST: prettyTypedDecl :: (Pretty a, Pretty b) => KempeDecl c a b -> Doc ann
- Kempe.AST: prettyFancyModule :: Declarations () (ConsAnn (StackType ())) (StackType ()) -> Doc ann
+ Kempe.AST: prettyFancyModule :: (Pretty a, Pretty b) => Declarations c (ConsAnn a) b -> Doc ann
- Kempe.AST: prettyTyped :: Atom (StackType ()) (StackType ()) -> Doc ann
+ Kempe.AST: prettyTyped :: (Pretty a, Pretty b) => Atom a b -> Doc ann
- Kempe.AST: prettyTypedModule :: Declarations () (StackType ()) (StackType ()) -> Doc ann
+ Kempe.AST: prettyTypedModule :: (Pretty a, Pretty b) => Declarations c a b -> Doc ann
Files
- CHANGELOG.md +6/−0
- README.md +3/−1
- bench/Bench.hs +0/−5
- kempe.cabal +1/−1
- lib/rational.kmp +5/−5
- src/Kempe/AST.hs +9/−5
- src/Kempe/AST/Size.hs +2/−6
- src/Kempe/IR.hs +0/−2
- src/Kempe/Inline.hs +2/−0
- src/Kempe/Module.hs +0/−1
- src/Kempe/TyAssign.hs +10/−9
- test/golden/gaussian.ir +44/−47
CHANGELOG.md view
@@ -1,5 +1,11 @@ # kempe +## 0.2.0.4++ * Kind-check external function declarations+ * Fix bug in inliner where functions within `dip(...)`s were not inlined+ * Fix unification bug where solved constraints were not back-substituted correctly.+ ## 0.2.0.3 * GHC 8.0.2 and 8.2.2
README.md view
@@ -6,7 +6,9 @@ Inspiration is primarily from [Mirth](https://github.com/mirth-lang/mirth). See manual-[here](http://hackage.haskell.org/package/kempe/src/docs/manual.pdf).+[here](http://hackage.haskell.org/package/kempe/src/docs/manual.pdf). There is+also a tour of the compiler available+[here](http://vmchale.com/static/original/compiler.pdf). ## Installation
bench/Bench.hs view
@@ -2,7 +2,6 @@ import Control.Exception (throw) import Criterion.Main-import Data.Bifunctor (Bifunctor, bimap) import qualified Data.ByteString.Lazy as BSL import qualified Data.Text as T import qualified Data.Text.Lazy.IO as TLIO@@ -27,9 +26,6 @@ import System.IO (hFlush) import System.IO.Temp (withSystemTempFile) -bivoid :: Bifunctor p => p a b -> p () ()-bivoid = bimap (const ()) (const ())- main :: IO () main = defaultMain [ env (BSL.readFile "test/data/lex.kmp") $ \contents ->@@ -46,7 +42,6 @@ , bench "shuttle (test/data/ty.kmp)" $ nf (uncurry monomorphize) p , bench "shuttle (examples/splitmix.kmp)" $ nf (uncurry monomorphize) s , bench "closedModule" $ nf (runSpecialize =<<) (runAssign p)- , bench "closure" $ nf (\m -> closure (m, mkModuleMap m)) (bivoid <$> snd p) ] , env eitherMod $ \ e -> bgroup "Pattern match exhaustiveness checker"
kempe.cabal view
@@ -1,6 +1,6 @@ cabal-version: 3.0 name: kempe-version: 0.2.0.3+version: 0.2.0.4 license: BSD-3-Clause license-file: LICENSE copyright: Copyright: (c) 2020-2021 Vanessa McHale
lib/rational.kmp view
@@ -2,18 +2,18 @@ import"lib/numbertheory.kmp" ; Slightly suspect rational based on 'Int' type-type Rational { Rational Int Int }+type Rational a { Rational a a } -unRational : Rational -- Int Int+unRational : (Rational a) -- a a =: [ { case | Rational -> } ] -multRat : Rational Rational -- Rational+multRat : (Rational Int) (Rational Int) -- (Rational Int) =: [ dip(unRational) unRational dip(swap *) * Rational reduce ] -reduce : Rational -- Rational+reduce : (Rational Int) -- (Rational Int) =: [ unRational dup2 gcd dup dip(swap dip(/)) / Rational ] -addRat : Rational Rational -- Rational+addRat : (Rational Int) (Rational Int) -- (Rational Int) =: [ dip(unRational) unRational dip(swap) dup2 * dip(swap dip(swap) * dip(*) +) Rational reduce
src/Kempe/AST.hs view
@@ -25,6 +25,7 @@ , prettyFancyModule , prettyModule , flipStackType+ , prettyTypedDecl -- * I resent this... , voidStackType ) where@@ -79,7 +80,7 @@ pretty PatternWildcard{} = "_" pretty (PatternCons _ tn) = pretty tn -prettyTypedPattern :: Pattern (StackType ()) (StackType ()) -> Doc ann+prettyTypedPattern :: (Pretty a) => Pattern a b -> Doc ann prettyTypedPattern (PatternCons ty tn) = parens (pretty tn <+> ":" <+> pretty ty) prettyTypedPattern p = pretty p @@ -98,10 +99,10 @@ prettyLeaf :: Pattern c a -> [Atom c a] -> Doc ann prettyLeaf p as = pipe <+> pretty p <+> "->" <+> align (fillSep (fmap pretty as)) -prettyTypedLeaf :: Pattern (StackType ()) (StackType ()) -> [Atom (StackType ()) (StackType ())] -> Doc ann+prettyTypedLeaf :: (Pretty a, Pretty b) => Pattern a b -> [Atom a b] -> Doc ann prettyTypedLeaf p as = pipe <+> prettyTypedPattern p <+> "->" <+> align (fillSep (fmap prettyTyped as)) -prettyTyped :: Atom (StackType ()) (StackType ()) -> Doc ann+prettyTyped :: (Pretty a, Pretty b) => Atom a b -> Doc ann prettyTyped (AtName ty n) = parens (pretty n <+> ":" <+> pretty ty) prettyTyped (Dip _ as) = "dip(" <> fillSep (prettyTyped <$> as) <> ")" prettyTyped (AtBuiltin ty b) = parens (pretty b <+> ":" <+> pretty ty)@@ -243,10 +244,13 @@ prettyDecls :: Declarations a c b -> Doc ann prettyDecls = prettyDeclarationsGeneral pretty -prettyFancyModule :: Declarations () (ConsAnn (StackType ())) (StackType ()) -> Doc ann+prettyFancyModule :: (Pretty a, Pretty b) => Declarations c (ConsAnn a) b -> Doc ann prettyFancyModule = prettyTypedModule . fmap (first consTy) -prettyTypedModule :: Declarations () (StackType ()) (StackType ()) -> Doc ann+prettyTypedDecl :: (Pretty a, Pretty b) => KempeDecl c a b -> Doc ann+prettyTypedDecl = prettyKempeDecl prettyTyped++prettyTypedModule :: (Pretty a, Pretty b) => Declarations c a b -> Doc ann prettyTypedModule = prettyDeclarationsGeneral prettyTyped prettyModule :: Module a c b -> Doc ann
src/Kempe/AST/Size.hs view
@@ -15,7 +15,6 @@ -- * Sizing bits , SizeEnv , Size- , cSize , size , size' , sizeStack@@ -82,7 +81,7 @@ type Size = [Int64] -> Int64 type SizeEnv = IM.IntMap Size --- the kempe sizing system is kind of fucked (it mostly works tho)+-- the kempe sizing system is kind of fucked (it works tho) -- | Don't call this on ill-kinded types; it won't throw any error. size :: SizeEnv -> KempeTy a -> Size@@ -94,11 +93,8 @@ size env (TyNamed _ (Name _ (Unique k) _)) = IM.findWithDefault (error "Size not in map!") k env size env (TyApp _ ty ty') = \tys -> size env ty (size env ty' [] : tys) -cSize :: Size -> Int64-cSize = ($ [])- size' :: SizeEnv -> KempeTy a -> Int64-size' env = cSize . size env+size' env = ($ []) . size env sizeStack :: SizeEnv -> [KempeTy a] -> Int64 sizeStack env = getSum . foldMap (Sum . size' env)
src/Kempe/IR.hs view
@@ -97,8 +97,6 @@ assignName Export{} = pure () assignName TyDecl{} = error "Internal error: type declarations should not exist at this stage" ---- FIXME: Current broadcast + write approach fails mutually recursive functions writeDecl :: SizeEnv -> KempeDecl () (ConsAnn MonoStackType) MonoStackType -> TempM [Stmt] writeDecl env (FunDecl _ n _ _ as) = do bl <- lookupName n
src/Kempe/Inline.hs view
@@ -29,6 +29,8 @@ else foldMap (inlineAtom declName) $ findDecl a n inlineAtom declName (If l as as') = [If l (inlineAtoms declName as) (inlineAtoms declName as')]+ inlineAtom declName (Dip l as) =+ [Dip l (inlineAtoms declName as)] inlineAtom declName (Case l ls) = let (ps, ass) = NE.unzip ls in [Case l (NE.zip ps $ fmap (inlineAtoms declName) ass)]
src/Kempe/Module.hs view
@@ -22,7 +22,6 @@ yeetIO :: Exception e => Either e a -> IO a yeetIO = either throwIO pure --- TODO: if module is imported, discard its exports loopFps :: Bool -> [FilePath] -> AlexUserState -> IO (AlexUserState, [FilePath], Declarations AlexPosn AlexPosn AlexPosn) loopFps _ [] st = pure (st, [], []) loopFps isInit (fp:fps) st = do
src/Kempe/TyAssign.hs view
@@ -28,7 +28,7 @@ import Kempe.Unique import Lens.Micro (Lens', over) import Lens.Micro.Mtl (modifying, (.=))-import Prettyprinter (Doc, Pretty (pretty), hardline, indent, vsep, (<+>))+import Prettyprinter (Doc, Pretty (pretty), vsep, (<+>)) import Prettyprinter.Debug import Prettyprinter.Ext @@ -113,11 +113,11 @@ in unifyMatch um $ (ty'', ty'''):tys unifyMatch :: UnifyMap -> [(KempeTy (), KempeTy ())] -> Either (Error ()) (IM.IntMap (KempeTy ()))-unifyMatch _ [] = Right mempty+unifyMatch _ [] = Right mempty unifyMatch um ((ty@(TyBuiltin _ b0), ty'@(TyBuiltin _ b1)):tys) | b0 == b1 = unifyPrep um tys | otherwise = Left (UnificationFailed () ty ty') unifyMatch um ((ty@(TyNamed _ n0), ty'@(TyNamed _ n1)):tys) | n0 == n1 = unifyPrep um tys- | otherwise = Left (UnificationFailed () (void ty) (void ty'))+ | otherwise = Left (UnificationFailed () (void ty) (void ty')) unifyMatch um ((ty@(TyNamed _ _), TyVar _ (Name _ (Unique k) _)):tys) = IM.insert k ty <$> unifyPrep (IM.insert k ty um) tys unifyMatch um ((TyVar _ (Name _ (Unique k) _), ty@(TyNamed _ _)):tys) = IM.insert k ty <$> unifyPrep (IM.insert k ty um) tys unifyMatch um ((ty@TyBuiltin{}, TyVar _ (Name _ (Unique k) _)):tys) = IM.insert k ty <$> unifyPrep (IM.insert k ty um) tys@@ -130,7 +130,7 @@ unifyMatch _ ((ty@TyApp{}, ty'@TyBuiltin{}):_) = Left (UnificationFailed () ty ty') unifyMatch um ((TyVar _ (Name _ (Unique k) _), ty@TyApp{}):tys) = IM.insert k ty <$> unifyPrep (IM.insert k ty um) tys unifyMatch um ((ty@TyApp{}, TyVar _ (Name _ (Unique k) _)):tys) = IM.insert k ty <$> unifyPrep (IM.insert k ty um) tys-unifyMatch um ((TyApp _ ty ty', TyApp _ ty'' ty'''):tys) = unifyMatch um ((ty, ty'') : (ty', ty''') : tys) -- TODO: I think this is right?+unifyMatch um ((TyApp _ ty ty', TyApp _ ty'' ty'''):tys) = unifyMatch um ((ty, ty'') : (ty', ty''') : tys) unifyMatch _ ((ty@TyApp{}, ty'@TyNamed{}):_) = Left (UnificationFailed () (void ty) (void ty')) unify :: [(KempeTy (), KempeTy ())] -> Either (Error ()) (IM.IntMap (KempeTy ()))@@ -410,10 +410,10 @@ traverse_ kindOf (void <$> ins ++ out) -- FIXME: this gives sketchy results? sig <- renameStack $ voidStackType $ StackType (freeVars (ins ++ out)) ins out inferred <- tyAtoms as- _ <- mergeStackTypes sig inferred -- FIXME: need to verify the merged type is as general as the signature?+ _ <- mergeStackTypes sig inferred when (inferred `lessGeneral` sig) $ throwError $ LessGeneral () sig inferred-tyInsert ExtFnDecl{} = pure () -- TODO: kind-check+tyInsert (ExtFnDecl _ _ ins outs _) = traverse_ kindOf (void <$> ins ++ outs) tyInsert Export{} = pure () tyModule :: Declarations a c b -> TypeM () ()@@ -529,9 +529,10 @@ substConstraints _ ty@TyBuiltin{} = ty substConstraints tys ty@(TyVar _ (Name _ (Unique k) _)) = case IM.lookup k tys of- Just ty'@TyVar{} -> substConstraints (IM.delete k tys) ty' -- TODO: this is to prevent cyclic lookups: is it right?- Just ty' -> ty'- Nothing -> ty+ Just ty'@TyVar{} -> substConstraints (IM.delete k tys) ty' -- TODO: this is to prevent cyclic lookups: is it right?+ Just (TyApp l ty0 ty1) -> TyApp l (substConstraints tys ty0) (substConstraints tys ty1)+ Just ty' -> ty'+ Nothing -> ty substConstraints tys (TyApp l ty ty') = TyApp l (substConstraints tys ty) (substConstraints tys ty')
test/golden/gaussian.ir view
@@ -1,11 +1,6 @@ kmp1:-(movtemp datapointer (- (reg datapointer) (int 17)))-(ret)--kmp2:-(movtemp datapointer (- (reg datapointer) (int 17)))-(call kmp1)+(movtemp datapointer (- (reg datapointer) (int 34))) (movmem (reg datapointer) (mem [8] (+ (reg datapointer) (int 17)))) (movmem (+ (reg datapointer) (int 8)) (mem [8] (+ (reg datapointer) (int 25)))) (movmem (+ (reg datapointer) (int 16)) (mem [1] (+ (reg datapointer) (int 33))))@@ -29,35 +24,7 @@ (movtemp datapointer (+ (reg datapointer) (int 1))) (ret) -kmp3:-(movtemp datapointer (- (reg datapointer) (int 17)))-(call kmp1)-(movmem (reg datapointer) (mem [8] (+ (reg datapointer) (int 17))))-(movmem (+ (reg datapointer) (int 8)) (mem [8] (+ (reg datapointer) (int 25))))-(movmem (+ (reg datapointer) (int 16)) (mem [1] (+ (reg datapointer) (int 33))))-(movmem (reg datapointer) (mem [8] (- (reg datapointer) (int 24))))-(movmem (- (reg datapointer) (int 24)) (mem [8] (- (reg datapointer) (int 16))))-(movmem (- (reg datapointer) (int 16)) (mem [8] (- (reg datapointer) (int 0))))-(movtemp datapointer (- (reg datapointer) (int 8)))-(movtemp t_5 (mem [8] (reg datapointer)))-(movtemp datapointer (- (reg datapointer) (int 8)))-(movtemp t_6 (mem [8] (reg datapointer)))-(movmem (reg datapointer) (* (reg t_6) (reg t_5)))-(movtemp datapointer (- (reg datapointer) (int 8)))-(movtemp t_7 (mem [8] (reg datapointer)))-(movtemp datapointer (- (reg datapointer) (int 8)))-(movtemp t_8 (mem [8] (reg datapointer)))-(movmem (reg datapointer) (* (reg t_8) (reg t_7)))-(movtemp datapointer (+ (reg datapointer) (int 8)))-(movmem (reg datapointer) (mem [8] (+ (reg datapointer) (int 8))))-(movtemp t_9 (mem [8] (reg datapointer)))-(movtemp datapointer (- (reg datapointer) (int 8)))-(movtemp t_10 (mem [8] (reg datapointer)))-(movmem (reg datapointer) (- (reg t_10) (reg t_9)))-(movtemp datapointer (+ (reg datapointer) (int 8)))-(ret)--kmp4:+kmp2: (movmem (reg datapointer) (mem [8] (- (reg datapointer) (int 17)))) (movmem (+ (reg datapointer) (int 8)) (mem [8] (- (reg datapointer) (int 9)))) (movmem (+ (reg datapointer) (int 16)) (mem [1] (- (reg datapointer) (int 1))))@@ -92,16 +59,15 @@ (movmem (- (reg datapointer) (int 17)) (mem [8] (- (reg datapointer) (int 0)))) (movmem (- (reg datapointer) (int 9)) (mem [8] (+ (reg datapointer) (int 8)))) (movmem (- (reg datapointer) (int 1)) (mem [1] (+ (reg datapointer) (int 16))))-(movtemp datapointer (- (reg datapointer) (int 17)))-(call kmp1)+(movtemp datapointer (- (reg datapointer) (int 34))) (movmem (reg datapointer) (mem [8] (+ (reg datapointer) (int 17)))) (movmem (+ (reg datapointer) (int 8)) (mem [8] (+ (reg datapointer) (int 25)))) (movmem (+ (reg datapointer) (int 16)) (mem [1] (+ (reg datapointer) (int 33)))) (movtemp datapointer (- (reg datapointer) (int 16)))-(movtemp t_11 (mem [8] (reg datapointer)))+(movtemp t_5 (mem [8] (reg datapointer))) (movtemp datapointer (- (reg datapointer) (int 8)))-(movtemp t_12 (mem [8] (reg datapointer)))-(movmem (reg datapointer) (* (reg t_12) (reg t_11)))+(movtemp t_6 (mem [8] (reg datapointer)))+(movmem (reg datapointer) (* (reg t_6) (reg t_5))) (movtemp datapointer (+ (reg datapointer) (int 8))) (movmem (reg datapointer) (mem [8] (+ (reg datapointer) (int 8)))) (movtemp datapointer (+ (reg datapointer) (int 8)))@@ -109,24 +75,55 @@ (movmem (- (reg datapointer) (int 16)) (mem [8] (- (reg datapointer) (int 8)))) (movmem (- (reg datapointer) (int 8)) (mem [8] (- (reg datapointer) (int 0)))) (movtemp datapointer (- (reg datapointer) (int 16)))+(movtemp t_7 (mem [8] (reg datapointer)))+(movtemp datapointer (- (reg datapointer) (int 8)))+(movtemp t_8 (mem [8] (reg datapointer)))+(movmem (reg datapointer) (* (reg t_8) (reg t_7)))+(movtemp datapointer (+ (reg datapointer) (int 8)))+(movmem (reg datapointer) (mem [8] (+ (reg datapointer) (int 8))))+(movtemp t_9 (mem [8] (reg datapointer)))+(movtemp datapointer (- (reg datapointer) (int 8)))+(movtemp t_10 (mem [8] (reg datapointer)))+(movmem (reg datapointer) (+ (reg t_10) (reg t_9)))+(movtemp datapointer (- (reg datapointer) (int 0)))+(movmem (reg datapointer) (mem [8] (+ (reg datapointer) (int 25))))+(movmem (+ (reg datapointer) (int 8)) (mem [8] (+ (reg datapointer) (int 33))))+(movmem (+ (reg datapointer) (int 16)) (mem [8] (+ (reg datapointer) (int 41))))+(movmem (+ (reg datapointer) (int 24)) (mem [1] (+ (reg datapointer) (int 49))))+(movtemp datapointer (- (reg datapointer) (int 34)))+(movmem (reg datapointer) (mem [8] (+ (reg datapointer) (int 8))))+(movtemp datapointer (+ (reg datapointer) (int 8)))+(movmem (reg datapointer) (mem [8] (- (reg datapointer) (int 32))))+(movmem (- (reg datapointer) (int 32)) (mem [8] (- (reg datapointer) (int 24))))+(movmem (- (reg datapointer) (int 24)) (mem [8] (- (reg datapointer) (int 0))))+(movtemp datapointer (- (reg datapointer) (int 16)))+(movtemp t_11 (mem [8] (reg datapointer)))+(movtemp datapointer (- (reg datapointer) (int 8)))+(movtemp t_12 (mem [8] (reg datapointer)))+(movmem (reg datapointer) (* (reg t_12) (reg t_11)))+(movtemp datapointer (+ (reg datapointer) (int 8)))+(movmem (reg datapointer) (mem [8] (+ (reg datapointer) (int 8))))+(movtemp datapointer (- (reg datapointer) (int 0))) (movtemp t_13 (mem [8] (reg datapointer))) (movtemp datapointer (- (reg datapointer) (int 8))) (movtemp t_14 (mem [8] (reg datapointer))) (movmem (reg datapointer) (* (reg t_14) (reg t_13))) (movtemp datapointer (+ (reg datapointer) (int 8)))-(movmem (reg datapointer) (mem [8] (+ (reg datapointer) (int 8))))+(movmem (reg datapointer) (mem [8] (+ (reg datapointer) (int 16))))+(movmem (+ (reg datapointer) (int 8)) (mem [8] (+ (reg datapointer) (int 24))))+(movtemp datapointer (- (reg datapointer) (int 16))) (movtemp t_15 (mem [8] (reg datapointer))) (movtemp datapointer (- (reg datapointer) (int 8))) (movtemp t_16 (mem [8] (reg datapointer)))-(movmem (reg datapointer) (+ (reg t_16) (reg t_15)))-(call kmp3)+(movmem (reg datapointer) (- (reg t_16) (reg t_15)))+(movtemp datapointer (+ (reg datapointer) (int 8))) (movmem (reg datapointer) (mem [8] (+ (reg datapointer) (int 8)))) (movtemp datapointer (+ (reg datapointer) (int 8))) (movmem (reg datapointer) (tag 0x0)) (movtemp datapointer (+ (reg datapointer) (int 1))) (ret) -kmp5:+kmp3: (movtemp datapointer (- (reg datapointer) (int 25))) (movtemp t_17 (mem [8] (reg datapointer))) (movmem (reg datapointer) (~ (reg t_17)))@@ -135,8 +132,8 @@ (movtemp datapointer (+ (reg datapointer) (int 1))) (ret) -export add {Gaussian_1 Gaussian_1 -- Gaussian_1} kmp2+export add {Gaussian_1 Gaussian_1 -- Gaussian_1} kmp1 -export conjugate {Gaussian_1 -- Gaussian_1} kmp5+export conjugate {Gaussian_1 -- Gaussian_1} kmp3 -export mult {Gaussian_1 Gaussian_1 -- Gaussian_1} kmp4+export mult {Gaussian_1 Gaussian_1 -- Gaussian_1} kmp2