-----------------------------------------------------------------------------
-- |
-- Module      :  ForSyDe.Backend.VHDL.Constants
-- Copyright   :  (c) SAM Group, KTH/ICT/ECS
-- License     :  BSD-style (see the file LICENSE)
-- 
-- Maintainer  :  forsyde-dev@ict.kth.se
-- Stability   :  experimental
-- Portability :  portable
--
-- Constants used in the VHDL backend
--
-----------------------------------------------------------------------------
module ForSyDe.Backend.VHDL.Constants where

import ForSyDe.Backend.VHDL.AST

-- | Standard context clause used in all generated vhdl files. It imports
commonContextClause :: [ContextItem]
commonContextClause = 
  [Library forsydeId, 
   Library ieeeId,
   Use     $ NSelected (NSimple forsydeId :.: SSimple typesId) :.: All,
   Use     $ NSelected (NSimple ieeeId :.: SSimple std_logic_1164Id) :.: All,
   Use     $ NSelected (NSimple ieeeId :.: SSimple numeric_stdId) :.: All]
 where forsydeId = unsafeVHDLBasicId "forsyde" 
       ieeeId = unsafeVHDLBasicId "ieee"
       typesId = unsafeVHDLBasicId "types"
       std_logic_1164Id = unsafeVHDLBasicId "std_logic_1164"
       numeric_stdId = unsafeVHDLBasicId "numeric_std"

--------------
-- Identifiers
--------------

-- | reset and clock signal identifiers in String form
resetStr, clockStr :: String
resetStr = "resetn"
clockStr = "clock"

-- | reset and clock signal identifiers in basic VHDLId form
resetId, clockId :: VHDLId
resetId = unsafeVHDLBasicId resetStr
clockId = unsafeVHDLBasicId clockStr


-- | \"types\" identifier
typesId :: VHDLId
typesId = unsafeVHDLBasicId "types"

-- | work identifier
workId :: VHDLId
workId = unsafeVHDLBasicId "work"

-- | std identifier
stdId :: VHDLId
stdId = unsafeVHDLBasicId "std"


-- | textio identifier
textioId :: VHDLId
textioId = unsafeVHDLBasicId "textio"

-- | range attribute identifier
rangeId :: VHDLId
rangeId = unsafeVHDLBasicId "range"


-- | range attribute identifier
imageId :: VHDLId
imageId = unsafeVHDLBasicId "image"

-- | event attribute identifie
eventId :: VHDLId
eventId = unsafeVHDLBasicId "event"


-- | default function identifier
defaultId :: VHDLId
defaultId = unsafeVHDLBasicId "default"


-- AsbtExt function identifiers

-- | absent function identifier
absentId :: VHDLId
absentId = unsafeVHDLBasicId "absent"

-- | present function identifier
presentId :: VHDLId
presentId = unsafeVHDLBasicId "present"

-- | fromAbstExt function identifier
fromAbstExtId :: VHDLId
fromAbstExtId = unsafeVHDLBasicId "fromAbstExt"

-- | unsafeFromAbstExt function identifier
unsafeFromAbstExtId :: VHDLId
unsafeFromAbstExtId = unsafeVHDLBasicId "unsafeFromAbstExt"

-- | value element identifier
valueId :: VHDLId
valueId = unsafeVHDLBasicId "value"

-- | value element suffix
valueSuffix :: Suffix
valueSuffix = SSimple valueId

-- | isPresent function and element identifier
isPresentId :: VHDLId
isPresentId = unsafeVHDLBasicId "isPresent"

-- | isAbsent function identifier
isAbsentId :: VHDLId
isAbsentId = unsafeVHDLBasicId "isAbsent"

-- FSVec function identifiers

-- | ex (operator ! in original Haskell source) function identifier
exId :: VHDLId
exId = unsafeVHDLBasicId "ex"

-- | sel (function select in original Haskell source) function identifier
selId :: VHDLId
selId = unsafeVHDLBasicId "sel"


-- | ltplus (function (<+) in original Haskell source) function identifier
ltplusId :: VHDLId
ltplusId = unsafeVHDLBasicId "ltplus"


-- | plusplus (function (++) in original Haskell source) function identifier
plusplusId :: VHDLId
plusplusId = unsafeVHDLBasicId "plusplus"


-- | empty function identifier
emptyId :: VHDLId
emptyId = unsafeVHDLBasicId "empty"

-- | plusgt (function (+>) in original Haskell source) function identifier
plusgtId :: VHDLId
plusgtId = unsafeVHDLBasicId "plusgt"

-- | singleton function identifier
singletonId :: VHDLId
singletonId = unsafeVHDLBasicId "singleton"

-- | length function identifier
lengthId :: VHDLId
lengthId = unsafeVHDLBasicId "length"


-- | isnull (function null in original Haskell source) function identifier
isnullId :: VHDLId
isnullId = unsafeVHDLBasicId "isnull"


-- | replace function identifier
replaceId :: VHDLId
replaceId = unsafeVHDLBasicId "replace"


-- | head function identifier
headId :: VHDLId
headId = unsafeVHDLBasicId "head"


-- | last function identifier
lastId :: VHDLId
lastId = unsafeVHDLBasicId "last"


-- | init function identifier
initId :: VHDLId
initId = unsafeVHDLBasicId "init"


-- | tail function identifier
tailId :: VHDLId
tailId = unsafeVHDLBasicId "tail"


-- | take function identifier
takeId :: VHDLId
takeId = unsafeVHDLBasicId "take"


-- | drop function identifier
dropId :: VHDLId
dropId = unsafeVHDLBasicId "drop"

-- | shiftl function identifier
shiftlId :: VHDLId
shiftlId = unsafeVHDLBasicId "shiftl"

-- | shiftr function identifier
shiftrId :: VHDLId
shiftrId = unsafeVHDLBasicId "shiftr"

-- | rotl function identifier
rotlId :: VHDLId
rotlId = unsafeVHDLBasicId "rotl"

-- | reverse function identifier
rotrId :: VHDLId
rotrId = unsafeVHDLBasicId "rotr"

-- | reverse function identifier
reverseId :: VHDLId
reverseId = unsafeVHDLBasicId "reverse"

-- | toBitVector8 function identifier
toBitVector8Id :: VHDLId
toBitVector8Id = unsafeVHDLBasicId "toBitVector8"

-- | toBitVector16 function identifier
toBitVector16Id :: VHDLId
toBitVector16Id = unsafeVHDLBasicId "toBitVector16"

-- | toBitVector32 function identifier
toBitVector32Id :: VHDLId
toBitVector32Id = unsafeVHDLBasicId "toBitVector32"


-- | fromBitVector8 function identifier
fromBitVector8Id :: VHDLId
fromBitVector8Id = unsafeVHDLBasicId "fromBitVector8"


-- | fromBitVector16 function identifier
fromBitVector16Id :: VHDLId
fromBitVector16Id = unsafeVHDLBasicId "fromBitVector16"


-- | fromBitVector32 function identifier
fromBitVector32Id :: VHDLId
fromBitVector32Id = unsafeVHDLBasicId "fromBitVector32"



-- | copy function identifier
copyId :: VHDLId
copyId = unsafeVHDLBasicId "copy"


-- | show function identifier
showId :: VHDLId
showId = unsafeVHDLBasicId "show"


-- | write function idenfier (from std.textio)
writeId :: VHDLId
writeId = unsafeVHDLBasicId "write"

-- | output file identifier (from std.textio)
outputId :: VHDLId
outputId = unsafeVHDLBasicId "output"

--------
-- Names
--------

defaultSN :: VHDLName
defaultSN = NSimple defaultId

------------------
-- VHDL type marks
------------------

-- | Stardard logic type mark
std_logicTM :: TypeMark
std_logicTM = unsafeVHDLBasicId "std_logic"

-- | boolean type mark
booleanTM :: TypeMark
booleanTM = unsafeVHDLBasicId "boolean"

-- | fsvec_index typemark
fsvec_indexTM :: TypeMark
fsvec_indexTM = unsafeVHDLBasicId "fsvec_index"

-- | natural typemark
naturalTM :: TypeMark
naturalTM = unsafeVHDLBasicId "natural"

-- | int32 typemark (defined in ForSyDe's VHDL library)
int64TM :: TypeMark
int64TM = unsafeVHDLBasicId "int64"

-- | int32 typemark (defined in ForSyDe's VHDL library)
int32TM :: TypeMark
int32TM = unsafeVHDLBasicId "int32"

-- | int32 typemark (defined in ForSyDe's VHDL library)
int16TM :: TypeMark
int16TM = unsafeVHDLBasicId "int16"

-- | int8 typemark (defined in ForSyDe's VHDL library)
int8TM :: TypeMark
int8TM = unsafeVHDLBasicId "int8"

-- | string typemark
stringTM :: TypeMark
stringTM = unsafeVHDLBasicId "string"

--------------
-- Expressions
--------------

-- | true expression
trueExpr :: Expr
trueExpr = PrimName (NSimple $ unsafeVHDLBasicId "true")
 
-- | false expression
falseExpr :: Expr
falseExpr = PrimName (NSimple $ unsafeVHDLBasicId "false")

-- | \'0\' bit expression
lowExpr :: Expr
lowExpr = PrimLit "'0'"

-- | \'1\' bit expression
highExpr :: Expr
highExpr = PrimLit "'1'"

-- | tup string record suffix
tupStrSuffix :: Int -> String
tupStrSuffix n = "tup_" ++ show n

-- | tup VHLID record suffix
tupVHDLIdSuffix :: Int -> VHDLId
tupVHDLIdSuffix = unsafeVHDLBasicId . tupStrSuffix

-- | tup VHDLName suffix
tupVHDLSuffix :: Int -> Suffix
tupVHDLSuffix = SSimple . tupVHDLIdSuffix