aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorYann Herklotz <ymherklotz@gmail.com>2018-12-01 15:12:38 +0000
committerYann Herklotz <ymherklotz@gmail.com>2018-12-01 15:12:38 +0000
commitbe498dd4534e88f0203f76aed2a4afe516013129 (patch)
tree78aff6793e52f34ba023b3593d01a8e46ccbf27f /src
parentaf11f75f296723050f2c945a80caeb5df490d93d (diff)
downloadverismith-be498dd4534e88f0203f76aed2a4afe516013129.tar.gz
verismith-be498dd4534e88f0203f76aed2a4afe516013129.zip
Move generation to new location
Diffstat (limited to 'src')
-rw-r--r--src/Test/VeriFuzz/CodeGen.hs75
-rw-r--r--src/Test/VeriFuzz/Graph/CodeGen.hs63
2 files changed, 79 insertions, 59 deletions
diff --git a/src/Test/VeriFuzz/CodeGen.hs b/src/Test/VeriFuzz/CodeGen.hs
index a19c83c..4e4fb8c 100644
--- a/src/Test/VeriFuzz/CodeGen.hs
+++ b/src/Test/VeriFuzz/CodeGen.hs
@@ -2,62 +2,19 @@
module Test.VeriFuzz.CodeGen where
-import Data.Graph.Inductive (Graph, LNode, Node, indeg, labNodes,
- nodes, outdeg, pre)
-import Data.Maybe (fromMaybe)
-import Data.Text (Text, empty, pack)
-import Test.VeriFuzz.Types
-
-fromNode :: Node -> Text
-fromNode node = pack $ "w" <> show node
-
-filterGr :: (Graph gr) => gr n e -> (Node -> Bool) -> [Node]
-filterGr graph f =
- filter f $ nodes graph
-
-fromList :: (Foldable t, Monoid a) => t a -> a
-fromList = foldl mappend mempty
-
-safe :: ([a] -> b) -> [a] -> Maybe b
-safe _ [] = Nothing
-safe f l = Just $ f l
-
-toOperator :: Gate -> Text
-toOperator And = " & "
-toOperator Or = " | "
-toOperator Xor = " ^ "
-
-sep :: (Monoid a) => a -> [a] -> a
-sep el l = fromMaybe mempty $
- (fromList . fmap (<>el) <$> safe init l) <> safe last l
-
-statList :: Gate -> [Node] -> Maybe Text
-statList g n = toStr <$> safe tail n
- where
- toStr = fromList . fmap ((<> toOperator g) . fromNode)
-
-lastEl :: [Node] -> Maybe Text
-lastEl n = fromNode <$> safe head n
-
-toStatement :: (Graph gr) => gr Gate e -> LNode Gate -> Text
-toStatement graph (n, g) =
- fromMaybe empty $ Just " assign " <> Just (fromNode n)
- <> Just " = " <> statList g nodeL <> lastEl nodeL <> Just ";\n"
- where
- nodeL = pre graph n
-
-generate :: (Graph gr) => gr Gate e -> Text
-generate graph =
- "module generated_module(\n"
- <> fromList (imap " input wire " ",\n" inp)
- <> sep ",\n" (imap " output wire " "" out)
- <> ");\n"
- <> fromList (toStatement graph <$> labNodes graph)
- <> "endmodule\n\nmodule main;\n initial\n begin\n "
- <> "$display(\"Hello, world\");\n $finish;\n "
- <> "end\nendmodule"
- where
- zero fun1 fun2 n = fun1 graph n == 0 && fun2 graph n /= 0
- inp = filterGr graph $ zero indeg outdeg
- out = filterGr graph $ zero outdeg indeg
- imap b e = fmap ((\s -> b <> s <> e) . fromNode)
+import Control.Lens
+import Data.Text (Text)
+import qualified Data.Text as T
+import Test.VeriFuzz.Internal.Shared
+import Test.VeriFuzz.VerilogAST
+
+genSourceText :: SourceText -> Text
+genSourceText source =
+ fromList $ genDescription <$> source ^. getSourceText
+
+genDescription :: Description -> Text
+genDescription desc =
+ genModuleDecl $ desc ^. getDescription
+
+genModuleDecl :: ModuleDecl -> Text
+genModuleDecl mod =
diff --git a/src/Test/VeriFuzz/Graph/CodeGen.hs b/src/Test/VeriFuzz/Graph/CodeGen.hs
new file mode 100644
index 0000000..4cbd828
--- /dev/null
+++ b/src/Test/VeriFuzz/Graph/CodeGen.hs
@@ -0,0 +1,63 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+module Test.VeriFuzz.Graph.CodeGen where
+
+import Data.Graph.Inductive (Graph, LNode, Node, indeg, labNodes,
+ nodes, outdeg, pre)
+import Data.Maybe (fromMaybe)
+import Data.Text (Text, empty, pack)
+import Test.VeriFuzz.Types
+
+fromNode :: Node -> Text
+fromNode node = pack $ "w" <> show node
+
+filterGr :: (Graph gr) => gr n e -> (Node -> Bool) -> [Node]
+filterGr graph f =
+ filter f $ nodes graph
+
+fromList :: (Foldable t, Monoid a) => t a -> a
+fromList = foldl mappend mempty
+
+safe :: ([a] -> b) -> [a] -> Maybe b
+safe _ [] = Nothing
+safe f l = Just $ f l
+
+toOperator :: Gate -> Text
+toOperator And = " & "
+toOperator Or = " | "
+toOperator Xor = " ^ "
+
+sep :: (Monoid a) => a -> [a] -> a
+sep el l = fromMaybe mempty $
+ (fromList . fmap (<>el) <$> safe init l) <> safe last l
+
+statList :: Gate -> [Node] -> Maybe Text
+statList g n = toStr <$> safe tail n
+ where
+ toStr = fromList . fmap ((<> toOperator g) . fromNode)
+
+lastEl :: [Node] -> Maybe Text
+lastEl n = fromNode <$> safe head n
+
+toStatement :: (Graph gr) => gr Gate e -> LNode Gate -> Text
+toStatement graph (n, g) =
+ fromMaybe empty $ Just " assign " <> Just (fromNode n)
+ <> Just " = " <> statList g nodeL <> lastEl nodeL <> Just ";\n"
+ where
+ nodeL = pre graph n
+
+generate :: (Graph gr) => gr Gate e -> Text
+generate graph =
+ "module generated_module(\n"
+ <> fromList (imap " input wire " ",\n" inp)
+ <> sep ",\n" (imap " output wire " "" out)
+ <> ");\n"
+ <> fromList (toStatement graph <$> labNodes graph)
+ <> "endmodule\n\nmodule main;\n initial\n begin\n "
+ <> "$display(\"Hello, world\");\n $finish;\n "
+ <> "end\nendmodule"
+ where
+ zero fun1 fun2 n = fun1 graph n == 0 && fun2 graph n /= 0
+ inp = filterGr graph $ zero indeg outdeg
+ out = filterGr graph $ zero outdeg indeg
+ imap b e = fmap ((\s -> b <> s <> e) . fromNode)