Sockeye: Add possibility to add reserved blocks
[barrelfish] / tools / sockeye / SockeyeAST.hs
index d6018ac..535ddf3 100644 (file)
 
 module SockeyeAST where
 
-import Data.List
-import Numeric (showHex)
-
-{-
-Nodes are identfied by strings
--}
-newtype NodeId = NodeId String deriving (Eq, Ord)
-
-{-
-Addresses are natural numbers
--}
-newtype Addr = Addr Word deriving (Eq, Ord)
-
-{-
-A block is a contigous set of addresses
--}
-data BlockSpec = BlockSpec
-    { base  :: Addr
-    , limit :: Addr
-    } deriving (Eq, Ord)
-
-{-
-A mapping of a source address block to a destination node
-at a base address
--}
-data MapSpec = MapSpec { srcBlock :: BlockSpec
-                       , destNode :: NodeId
-                       , destBase :: Addr
-                       }
-
-{-
-Node can either be memory, device or other
--}
-data NodeType = Memory
-              | Device
-              | Other
-
-{-
-A node is specified as a list of blocks it accepts,
-a list of mappings and possibly an overlay on another block
--}
-data NodeSpec = NodeSpec { nodeType  :: NodeType
-                         , accept    :: [BlockSpec]
-                         , translate :: [MapSpec]
-                         , overlay   :: Maybe NodeId
-                         }
-
-{-
-A decoding net is specified as a list 
-of Node IDs mapped to Nodes
--}
-newtype NetSpec = NetSpec [(NodeId, NodeSpec)]
-
-{- Pretty Printing -}
-instance Show NodeId where
-    show (NodeId id) = id
-
-instance Show Addr where
-    show (Addr addr) = "0x" ++ showHex addr ""
-
-instance Show BlockSpec where
-    show blockSpec = show (base blockSpec) ++ "-" ++ show (limit blockSpec)
-
-instance Show MapSpec where
-    show mapSpec = let srcStr  = show $ srcBlock mapSpec
-                       nodeStr = show $ destNode mapSpec
-                       baseStr = show $ destBase mapSpec
-                   in srcStr ++ " to " ++ nodeStr ++ " at " ++ baseStr
-
-instance Show NodeType where
-  show Memory = "memory"
-  show Device = "device"
-  show Other  = "other"
-
-instance Show NodeSpec where
-    show nodeSpec = let typeStr      = show $ nodeType nodeSpec
-                        acceptStr    = "accept [" ++ intercalate ", " (map show (accept nodeSpec)) ++ "]"
-                        translateStr = "map [" ++ intercalate ", " (map show (translate nodeSpec)) ++ "]"
-                        overlayStr   = case overlay nodeSpec of
-                                        Nothing     -> ""
-                                        Just nodeId -> "over " ++ show nodeId
-                    in intercalate " " [typeStr, acceptStr, translateStr, overlayStr]
-
-instance Show NetSpec where
-    show (NetSpec netSpec) = unlines $ map nodeStr netSpec
-                             where nodeStr (id, node) = show id ++ " is " ++ show node
\ No newline at end of file
+import Data.Map (Map)
+
+newtype SockeyeSpec = SockeyeSpec
+    { modules :: Map String Module }
+    deriving (Show)
+
+data Module = Module
+    { paramNames   :: [String]
+    , paramTypeMap :: Map String ModuleParamType
+    , inputPorts   :: [Port]
+    , outputPorts  :: [Port]
+    , nodeDecls    :: [NodeDecl]
+    , moduleInsts  :: [ModuleInst]
+    } deriving (Show)
+
+data ModuleParamType 
+    = NaturalParam
+    | AddressParam
+    deriving (Eq)
+
+instance Show ModuleParamType where
+    show NaturalParam = "nat"
+    show AddressParam = "addr"
+
+data Port
+    = InputPort 
+        { portId    :: Identifier
+        , portWidth :: !Integer
+        }
+    | OutputPort
+        { portId    :: Identifier
+        , portWidth :: !Integer
+        }
+    | MultiPort (For Port)
+    deriving (Show)
+
+data ModuleInst
+    = ModuleInst
+        { namespace  :: Identifier
+        , moduleName :: String
+        , arguments  :: Map String ModuleArg
+        , inPortMap  :: [PortMap]
+        , outPortMap :: [PortMap]
+        }
+    | MultiModuleInst (For ModuleInst)
+    deriving (Show)
+
+data ModuleArg
+    = AddressArg !Integer
+    | NaturalArg !Integer
+    | ParamArg !String
+    deriving (Show)
+
+data PortMap
+    = PortMap
+        { mappedId   :: Identifier
+        , mappedPort :: Identifier
+        }
+    | MultiPortMap (For PortMap)
+    deriving (Show)
+
+data NodeDecl
+    = NodeDecl
+        { nodeId   :: Identifier
+        , nodeSpec :: NodeSpec
+        }
+    | MultiNodeDecl (For NodeDecl)
+    deriving (Show)
+
+data Identifier
+    = SimpleIdent !String
+    | TemplateIdent
+        { prefix  :: !String
+        , varName :: !String
+        , suffix  :: Maybe Identifier
+        }
+    deriving (Show)
+
+data NodeSpec = NodeSpec
+    { nodeType  :: Maybe NodeType
+    , accept    :: [BlockSpec]
+    , translate :: [MapSpec]
+    , reserved  :: [BlockSpec]
+    , overlay   :: Maybe OverlaySpec
+    } deriving (Show)
+
+data NodeType
+    = Memory
+    | Device
+    deriving (Show)
+
+data BlockSpec 
+    = SingletonBlock
+        { base :: Address }
+    | RangeBlock
+        { base  :: Address
+        , limit :: Address
+        }
+    | LengthBlock
+        { base :: Address
+        , bits :: !Integer
+        }
+    deriving (Show)
+
+data MapSpec 
+    = MapSpec
+        { block    :: BlockSpec
+        , destNode :: Identifier
+        , destBase :: Maybe Address
+        } deriving (Show)
+
+data OverlaySpec
+    = OverlaySpec
+        { over  :: Identifier
+        , width :: !Integer
+        } deriving (Show)
+
+data Address
+    = LiteralAddress !Integer
+    | ParamAddress !String
+    deriving (Show)
+
+data For a 
+    = For
+        { varRanges :: Map String ForRange
+        , body      :: a
+        } deriving (Show)
+
+data ForRange
+    = ForRange
+    { start :: ForLimit
+    , end   :: ForLimit
+    } deriving (Show)
+
+data ForLimit 
+    = LiteralLimit !Integer
+    | ParamLimit !String
+    deriving (Show)