{-| Module : Verismith.Verilog.Quote Description : QuasiQuotation for verilog code in Haskell. Copyright : (c) 2019, Yann Herklotz Grave License : GPL-3 Maintainer : yann [at] yannherklotz [dot] com Stability : experimental Portability : POSIX QuasiQuotation for verilog code in Haskell. -} {-# LANGUAGE TemplateHaskell #-} module Verismith.Verilog.Quote ( verilog ) where import Data.Data import qualified Data.Text as T import qualified Language.Haskell.TH as TH import Language.Haskell.TH.Quote import Language.Haskell.TH.Syntax import Verismith.Verilog.Parser import Verismith.Verilog.AST (Verilog) liftDataWithText :: Data a => a -> Q Exp liftDataWithText = dataToExpQ $ fmap liftText . cast liftText :: T.Text -> Q Exp liftText txt = AppE (VarE 'T.pack) <$> lift (T.unpack txt) -- | Quasiquoter for verilog, so that verilog can be written inline and be -- parsed to an AST at compile time. verilog :: QuasiQuoter verilog = QuasiQuoter { quoteExp = quoteVerilog , quotePat = undefined , quoteType = undefined , quoteDec = undefined } quoteVerilog :: String -> TH.Q TH.Exp quoteVerilog s = do loc <- TH.location let pos = T.pack $ TH.loc_filename loc v <- case parseVerilog pos (T.pack s) of Right e -> return e Left e -> fail $ show e liftDataWithText (v :: Verilog ())