Sockeye: Correct imports
[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 import Numeric (showHex)
22
23 import qualified SockeyeASTBackend as AST
24
25 compile :: AST.NetSpec -> String
26 compile = generate
27
28 {- Code Generator -}
29 class PrologGenerator a where
30     generate :: a -> String
31
32 instance PrologGenerator AST.NetSpec where
33     generate (AST.NetSpec net) = unlines $ map toFact net
34         where toFact (nodeId, nodeSpec) = let atom = generate nodeId
35                                               node = generate nodeSpec
36                                           in predicate "net" [atom, node] ++ "."
37
38 instance PrologGenerator AST.NodeId where
39     generate (AST.NodeId id) = quotes id
40
41 instance PrologGenerator AST.NodeSpec where
42     generate nodeSpec = predicate "node" [nodeType, accept, translate, overlay]
43         where nodeType = generate (AST.nodeType nodeSpec)
44               accept = list $ map generate (AST.accept nodeSpec)
45               translate = list $ map generate (AST.translate nodeSpec)
46               overlay = case AST.overlay nodeSpec of
47                 Nothing -> "'@none'"
48                 Just id -> generate id
49
50 instance PrologGenerator AST.BlockSpec where
51     generate blockSpec = let base  = generate $ AST.base blockSpec
52                              limit = generate $ AST.limit blockSpec
53                          in predicate "block" [base, limit]
54
55 instance PrologGenerator AST.MapSpec where
56     generate mapSpec = let src  = generate $ AST.srcBlock mapSpec
57                            dest = generate $ AST.destNode mapSpec
58                            base = generate $ AST.destBase mapSpec
59                        in predicate "map" [src, dest, base]
60
61 instance PrologGenerator AST.NodeType where
62     generate = show 
63
64 instance PrologGenerator AST.Addr where
65     generate (AST.Addr addr) = "16'" ++ showHex addr ""
66
67 {- Helper functions -}
68 predicate :: String -> [String] -> String
69 predicate name args = name ++ (parens $ intercalate "," args)
70
71 list :: [String] -> String
72 list elems = brackets $ intercalate "," elems
73
74 enclose :: String -> String -> String -> String
75 enclose start end string = start ++ string ++ end
76
77 parens :: String -> String
78 parens = enclose "(" ")"
79
80 brackets :: String -> String
81 brackets = enclose "[" "]"
82
83 quotes :: String -> String
84 quotes = enclose "'" "'"