--
-- AST.hs --- HW quasiquoter AST.
--
-- Copyright (C) 2013, Galois, Inc.
-- All Rights Reserved.
--

module Ivory.BitData.AST where

-- | Basic type representation allowed in bit definitions.
data BitTy = TyCon String
           | TyNat Integer
           | TyApp BitTy BitTy
  deriving Show

-- | A bit integer literal with a known or unknown size.
data BitLiteral =
    BitLitKnown   { bitLitLen :: Int , bitLitVal :: Int }
  | BitLitUnknown { bitLitVal :: Int }
 deriving Show

-- | One element of a bit data constructor layout.
data LayoutItem = LayoutConst BitLiteral
                | LayoutField String
  deriving Show

-- | A constructor layout is a list of layout items.
type Layout = [LayoutItem]

-- | A "bitdata" definition.
data Def = Def
  { defName    :: String
  , defType    :: BitTy
  , defConstrs :: [Constr]
  }

-- | A constructor definition within a "bitdata".
data Constr = Constr
  { constrName   :: String
  , constrFields :: [Field]
  , constrLayout :: Layout
  }

-- | A record-like field defined within a "bitdata" constructor.
data Field = Field
  { fieldName :: String
  , fieldType :: BitTy
  }