Sockeye: Handle arbitrary large numbers
authorDaniel Schwyn <schwyda@student.ethz.ch>
Wed, 19 Jul 2017 14:03:02 +0000 (16:03 +0200)
committerDaniel Schwyn <schwyda@student.ethz.ch>
Wed, 19 Jul 2017 14:03:02 +0000 (16:03 +0200)
Signed-off-by: Daniel Schwyn <schwyda@student.ethz.ch>

tools/sockeye/SockeyeAST.hs
tools/sockeye/SockeyeASTDecodingNet.hs
tools/sockeye/SockeyeASTParser.hs
tools/sockeye/SockeyeNetBuilder.hs
tools/sockeye/SockeyeParser.hs

index bf7b359..2460961 100644 (file)
@@ -43,11 +43,11 @@ instance Show ModuleParamType where
 data Port
     = InputPort 
         { portId    :: Identifier
-        , portWidth :: !Word
+        , portWidth :: !Integer
         }
     | OutputPort
         { portId    :: Identifier
-        , portWidth :: !Word
+        , portWidth :: !Integer
         }
     | MultiPort (For Port)
     deriving (Show)
@@ -64,8 +64,8 @@ data ModuleInst
     deriving (Show)
 
 data ModuleArg
-    = AddressArg !Word
-    | NaturalArg !Word
+    = AddressArg !Integer
+    | NaturalArg !Integer
     | ParamArg !String
     deriving (Show)
 
@@ -115,7 +115,7 @@ data BlockSpec
         }
     | LengthBlock
         { base :: Address
-        , bits :: !Word
+        , bits :: !Integer
         }
     deriving (Show)
 
@@ -129,11 +129,11 @@ data MapSpec
 data OverlaySpec
     = OverlaySpec
         { over  :: Identifier
-        , width :: !Word
+        , width :: !Integer
         } deriving (Show)
 
 data Address
-    = LiteralAddress !Word
+    = LiteralAddress !Integer
     | ParamAddress !String
     deriving (Show)
 
@@ -150,6 +150,6 @@ data ForRange
     } deriving (Show)
 
 data ForLimit 
-    = LiteralLimit !Word
+    = LiteralLimit !Integer
     | ParamLimit !String
     deriving (Show)
index 11d2bee..e3aadcf 100644 (file)
@@ -68,5 +68,5 @@ data MapSpec = MapSpec
 
 newtype Address =
     Address
-        { address :: Word }
+        { address :: Integer }
     deriving (Show)
index 9cf4c21..e4b2b36 100644 (file)
@@ -66,11 +66,11 @@ data ModuleBody = ModuleBody
 data PortDef
     = InputPortDef
         { portId    :: Identifier
-        , portWidth :: !Word
+        , portWidth :: !Integer
         }
     | OutputPortDef
         { portId    :: Identifier
-        , portWidth :: !Word
+        , portWidth :: !Integer
         }
     | MultiPortDef (For PortDef)
     deriving (Show)
index 42c02f9..a58c458 100644 (file)
@@ -74,8 +74,8 @@ data Context = Context
     { spec         :: AST.SockeyeSpec
     , modulePath   :: [String]
     , curNamespace :: NetAST.Namespace
-    , paramValues  :: Map String Word
-    , varValues    :: Map String Word
+    , paramValues  :: Map String Integer
+    , varValues    :: Map String Integer
     , inPortMaps   :: Map String NetAST.NodeId
     , outPortMaps  :: Map String NetAST.NodeId
     , mappedBlocks :: [NetAST.BlockSpec]
@@ -171,7 +171,7 @@ instance NetTransformable AST.Port NetList where
                     node = portNode ident portWidth
                 return [(netPortId, node)]
 
-portNode :: NetAST.NodeId -> Word -> NetAST.NodeSpec
+portNode :: NetAST.NodeId -> Integer -> NetAST.NodeSpec
 portNode destNode width =
     let
         base = NetAST.Address 0
@@ -260,7 +260,7 @@ instance NetTransformable AST.PortMap PortMap where
         netMappedPort <- transform context mappedPort
         return [(NetAST.name netMappedPort, netMappedId)]
 
-instance NetTransformable AST.ModuleArg Word where
+instance NetTransformable AST.ModuleArg Integer where
     transform context (AST.AddressArg value) = return value
     transform context (AST.NaturalArg value) = return value
     transform context (AST.ParamArg name) = return $ getParamValue context name
@@ -377,7 +377,7 @@ instance NetTransformable AST.OverlaySpec [NetAST.MapSpec] where
             maps = overlayMaps netOver width blocks
         return maps
 
-overlayMaps :: NetAST.NodeId -> Word ->[NetAST.BlockSpec] -> [NetAST.MapSpec]
+overlayMaps :: NetAST.NodeId -> Integer ->[NetAST.BlockSpec] -> [NetAST.MapSpec]
 overlayMaps destId width blocks =
     let
         blockPoints = concat $ map toScanPoints blocks
@@ -423,8 +423,8 @@ overlayMaps destId width blocks =
             return ms
 
 data StoppingPoint
-    = BlockStart { address :: !Word }
-    | BlockEnd   { address :: !Word }
+    = BlockStart { address :: !Integer }
+    | BlockEnd   { address :: !Integer }
     deriving (Eq, Show)
 
 instance Ord StoppingPoint where
@@ -438,8 +438,8 @@ instance Ord StoppingPoint where
 
 data ScanLineState
     = ScanLineState
-        { insideBlocks :: !Word
-        , startAddress :: !Word
+        { insideBlocks :: !Integer
+        , startAddress :: !Integer
         } deriving (Show)
 
 instance NetTransformable AST.Address NetAST.Address where
@@ -476,7 +476,7 @@ instance NetTransformable a b => NetTransformable (AST.For a) [b] where
                 in context
                     { varValues = values `Map.union` varMap }
 
-instance NetTransformable AST.ForRange [Word] where
+instance NetTransformable AST.ForRange [Integer] where
     transform context ast = do
         let
             start = AST.start ast
@@ -485,7 +485,7 @@ instance NetTransformable AST.ForRange [Word] where
         endVal <- transform context end
         return [startVal..endVal]
 
-instance NetTransformable AST.ForLimit Word where
+instance NetTransformable AST.ForLimit Integer where
     transform _ (AST.LiteralLimit value) = return value
     transform context (AST.ParamLimit name) = return $ getParamValue context name
 
@@ -552,13 +552,13 @@ getModule context name =
         modules = AST.modules $ spec context
     in modules Map.! name
 
-getParamValue :: Context -> String -> Word
+getParamValue :: Context -> String -> Integer
 getParamValue context name =
     let
         params = paramValues context
     in params Map.! name
 
-getVarValue :: Context -> String -> Word
+getVarValue :: Context -> String -> Integer
 getVarValue context name =
     let
         vars = varValues context
index 7411e6a..544d56b 100644 (file)
@@ -97,7 +97,7 @@ portDefs = choice [inputPorts, outputPorts]
             symbol "/"
             portWidth <- decimal <?> "number of bits"
             let
-                portDef = AST.InputPortDef portId $ fromIntegral portWidth
+                portDef = AST.InputPortDef portId portWidth
             case forFn of
                 Nothing -> return portDef
                 Just f  -> return $ AST.MultiPortDef (f portDef)
@@ -109,7 +109,7 @@ portDefs = choice [inputPorts, outputPorts]
             symbol "/"
             portWidth <- decimal <?> "number of bits"
             let
-                portDef = AST.OutputPortDef portId $ fromIntegral portWidth
+                portDef = AST.OutputPortDef portId portWidth
             case forFn of
                 Nothing -> return portDef
                 Just f  -> return $ AST.MultiPortDef (f portDef)
@@ -148,10 +148,10 @@ moduleArg = choice [addressArg, numberArg, paramArg]
     where
         addressArg = do
             addr <- addressLiteral
-            return $ AST.AddressArg (fromIntegral addr)
+            return $ AST.AddressArg addr
         numberArg = do
             num <- numberLiteral
-            return $ AST.NaturalArg (fromIntegral num)
+            return $ AST.NaturalArg num
         paramArg = do
             name <- parameterName
             return $ AST.ParamArg name
@@ -247,13 +247,13 @@ blockSpec = choice [range, length, singleton]
         length = do
             base <- try $ address <* symbol "/"
             bits <- decimal <?> "number of bits"
-            return $ AST.LengthBlock base (fromIntegral bits)
+            return $ AST.LengthBlock base bits
 
 address = choice [address, param]
     where
         address = do
             addr <- addressLiteral
-            return $ AST.LiteralAddress (fromIntegral addr)
+            return $ AST.LiteralAddress addr
         param = do
             name <- parameterName
             return $ AST.ParamAddress name
@@ -281,7 +281,7 @@ overlay = do
     width <- decimal <?> "number of bits"
     return AST.OverlaySpec
         { AST.over  = over
-        , AST.width = fromIntegral width
+        , AST.width = width
         }
 
 identifierFor = identifierHelper True
@@ -309,7 +309,7 @@ forVarRange optVarName
         index = choice [numberIndex, paramIndex]
         numberIndex = do
             num <- numberLiteral
-            return $ AST.LiteralLimit (fromIntegral num)
+            return $ AST.LiteralLimit num
         paramIndex = do
             name <- parameterName
             return $ AST.ParamLimit name