Make Sockeye case sensitive again
[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) = quotes id
39
40 instance PrologGenerator AST.NodeSpec where
41     generate nodeSpec = predicate "node" [nodeType, accept, translate, overlay]
42         where nodeType = generate (AST.nodeType nodeSpec)
43               accept = list $ map generate (AST.accept nodeSpec)
44               translate = list $ map generate (AST.translate nodeSpec)
45               overlay = case AST.overlay nodeSpec of
46                 Nothing -> "'@none'"
47                 Just id -> generate id
48
49 instance PrologGenerator AST.BlockSpec where
50     generate blockSpec = let base  = generate $ AST.base blockSpec
51                              limit = generate $ AST.limit blockSpec
52                          in predicate "block" [base, limit]
53
54 instance PrologGenerator AST.MapSpec where
55     generate mapSpec = let src  = generate $ AST.srcBlock mapSpec
56                            dest = generate $ AST.destNode mapSpec
57                            base = generate $ AST.destBase mapSpec
58                        in predicate "map" [src, dest, base]
59
60 instance PrologGenerator AST.NodeType where
61     generate = show 
62
63 instance PrologGenerator AST.Addr where
64     generate (AST.Addr addr) = show addr
65
66 {- Helper functions -}
67 predicate :: String -> [String] -> String
68 predicate name args = name ++ (parens $ intercalate "," args)
69
70 list :: [String] -> String
71 list elems = brackets $ intercalate "," elems
72
73 enclose :: String -> String -> String -> String
74 enclose start end string = start ++ string ++ end
75
76 parens :: String -> String
77 parens = enclose "(" ")"
78
79 brackets :: String -> String
80 brackets = enclose "[" "]"
81
82 quotes :: String -> String
83 quotes = enclose "'" "'"