Rename sockey2 -> sockeye
[barrelfish] / tools / sockeye / SockeyeBackendProlog.hs
1 {-
2   SockeyeBackendProlog.hs: Backend for generating Prolog facts for Sockeye
3
4   Part of Sockeye
5
6   Copyright (c) 2017, ETH Zurich.
7
8   All rights reserved.
9
10   This file is distributed under the terms in the attached LICENSE file.
11   If you do not find this file, copies can be found by writing to:
12   ETH Zurich D-INFK, CAB F.78, Universitaetstr. 6, CH-8092 Zurich,
13   Attn: Systems Group.
14 -}
15
16 module SockeyeBackendProlog
17 ( compile ) where
18
19 import Data.List
20 import Data.Char
21
22 import qualified SockeyeAST as AST
23
24 compile :: AST.NetSpec -> String
25 compile = generate
26
27 {- Code Generator -}
28 class PrologGenerator a where
29     generate :: a -> String
30
31 instance PrologGenerator AST.NetSpec where
32     generate (AST.NetSpec net) = unlines $ map toFact net
33         where toFact (nodeId, nodeSpec) = let atom = generate nodeId
34                                               node = generate nodeSpec
35                                           in predicate "net" [atom, node] ++ "."
36
37 instance PrologGenerator AST.NodeId where
38     generate (AST.NodeId id) = map toLower id
39
40 instance PrologGenerator AST.NodeSpec where
41     generate nodeSpec = predicate "node" [accept, translate, overlay]
42         where accept = list $ map generate (AST.accept nodeSpec)
43               translate = list $ map generate (AST.translate nodeSpec)
44               overlay = case AST.overlay nodeSpec of
45                 Nothing -> "'@none'"
46                 Just id -> generate id
47
48 instance PrologGenerator AST.BlockSpec where
49     generate blockSpec = let base  = generate $ AST.base blockSpec
50                              limit = generate $ AST.limit blockSpec
51                          in predicate "block" [base, limit]
52
53 instance PrologGenerator AST.MapSpec where
54     generate mapSpec = let src  = generate $ AST.srcBlock mapSpec
55                            dest = generate $ AST.destNode mapSpec
56                            base = generate $ AST.destBase mapSpec
57                        in predicate "map" [src, dest, base]
58
59 instance PrologGenerator AST.Addr where
60     generate (AST.Addr addr) = show addr
61
62 {- Helper functions -}
63 predicate :: String -> [String] -> String
64 predicate name args = name ++ (parens $ intercalate "," args)
65
66 list :: [String] -> String
67 list elems = brackets $ intercalate "," elems
68
69 enclose :: String -> String -> String -> String
70 enclose start end string = start ++ string ++ end
71
72 parens :: String -> String
73 parens = enclose "(" ")"
74
75 brackets :: String -> String
76 brackets = enclose "[" "]"