aboutsummaryrefslogtreecommitdiffstats
path: root/src/Verismith/Verilog/Quote.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Verismith/Verilog/Quote.hs')
-rw-r--r--src/Verismith/Verilog/Quote.hs50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/Verismith/Verilog/Quote.hs b/src/Verismith/Verilog/Quote.hs
new file mode 100644
index 0000000..879b8fd
--- /dev/null
+++ b/src/Verismith/Verilog/Quote.hs
@@ -0,0 +1,50 @@
+{-|
+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
+
+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