verismith-1.1.0: src/Verismith/Verilog/Quote.hs
{-# LANGUAGE TemplateHaskell #-}
-- |
-- 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.
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.AST (Verilog)
import Verismith.Verilog.Parser
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 ())