-- Copyright © 2011 National Institute of Aerospace / Galois, Inc. -- | Primitives to build streams connected to external variables. {-# LANGUAGE Safe #-} module Copilot.Language.Operators.Extern ( extern , externB , externW8 , externW16 , externW32 , externW64 , externI8 , externI16 , externI32 , externI64 , externF , externD ) where import Copilot.Core (Typed) import Copilot.Language.Stream import Data.Word import Data.Int -- | Create a stream populated by an external global variable. -- -- The Copilot compiler does not check that the type is correct. If the list -- given as second argument does not constrain the type of the values carried -- by the stream, this primitive stream building function will match any stream -- of any type, which is potentially dangerous if the global variable mentioned -- has a different type. We rely on the compiler used with the generated code -- to detect type errors of this kind. extern :: Typed a => String -- ^ Name of the global variable to make accessible. -> Maybe [a] -- ^ Values to be used exclusively for testing/simulation. -> Stream a extern = Extern -- | Create a stream carrying values of type Bool, populated by an external -- global variable. externB :: String -- ^ Name of the global variable to make accessible. -> Maybe [Bool] -- ^ Values to be used exclusively for -- testing/simulation. -> Stream Bool externB = extern -- | Create a stream carrying values of type Word8, populated by an external -- global variable. externW8 :: String -- ^ Name of the global variable to make accessible. -> Maybe [Word8] -- ^ Values to be used exclusively for -- testing/simulation. -> Stream Word8 externW8 = extern -- | Create a stream carrying values of type Word16, populated by an external -- global variable. externW16 :: String -- ^ Name of the global variable to make accessible. -> Maybe [Word16] -- ^ Values to be used exclusively for -- testing/simulation. -> Stream Word16 externW16 = extern -- | Create a stream carrying values of type Word32, populated by an external -- global variable. externW32 :: String -- ^ Name of the global variable to make accessible. -> Maybe [Word32] -- ^ Values to be used exclusively for -- testing/simulation. -> Stream Word32 externW32 = extern -- | Create a stream carrying values of type Word64, populated by an external -- global variable. externW64 :: String -- ^ Name of the global variable to make accessible. -> Maybe [Word64] -- ^ Values to be used exclusively for -- testing/simulation. -> Stream Word64 externW64 = extern -- | Create a stream carrying values of type Int8, populated by an external -- global variable. externI8 :: String -- ^ Name of the global variable to make accessible. -> Maybe [Int8] -- ^ Values to be used exclusively for testing/simulation. -> Stream Int8 externI8 = extern -- | Create a stream carrying values of type Int16, populated by an external -- global variable. externI16 :: String -- ^ Name of the global variable to make accessible. -> Maybe [Int16] -- ^ Values to be used exclusively for testing/simulation. -> Stream Int16 externI16 = extern -- | Create a stream carrying values of type Int32, populated by an external -- global variable. externI32 :: String -- ^ Name of the global variable to make accessible. -> Maybe [Int32] -- ^ Values to be used exclusively for testing/simulation. -> Stream Int32 externI32 = extern -- | Create a stream carrying values of type Int64, populated by an external -- global variable. externI64 :: String -- ^ Name of the global variable to make accessible. -> Maybe [Int64] -- ^ Values to be used exclusively for testing/simulation. -> Stream Int64 externI64 = extern -- | Create a stream carrying values of type Float, populated by an external -- global variable. externF :: String -- ^ Name of the global variable to make accessible. -> Maybe [Float] -- ^ Values to be used exclusively for testing/simulation. -> Stream Float externF = extern -- | Create a stream carrying values of type Double, populated by an external -- global variable. externD :: String -- ^ Name of the global variable to make accessible. -> Maybe [Double] -- ^ Values to be used exclusively for testing/simulation. -> Stream Double externD = extern