aboutsummaryrefslogtreecommitdiffstats
path: root/src/Test/VeriFuzz/CodeGen.hs
diff options
context:
space:
mode:
authorYann Herklotz <ymherklotz@gmail.com>2018-11-16 21:17:29 +0000
committerYann Herklotz <ymherklotz@gmail.com>2018-11-16 21:17:29 +0000
commit9bb2f6d5a8815ec10f83e917395ac511a153e6f2 (patch)
treeb19107667d7b7ec57f55405e2c6cef5facb7be01 /src/Test/VeriFuzz/CodeGen.hs
parent339536b17935a622ba96dc764ae643a1ac8bf82d (diff)
downloadverismith-9bb2f6d5a8815ec10f83e917395ac511a153e6f2.tar.gz
verismith-9bb2f6d5a8815ec10f83e917395ac511a153e6f2.zip
Basic generation with errors
Diffstat (limited to 'src/Test/VeriFuzz/CodeGen.hs')
-rw-r--r--src/Test/VeriFuzz/CodeGen.hs26
1 files changed, 22 insertions, 4 deletions
diff --git a/src/Test/VeriFuzz/CodeGen.hs b/src/Test/VeriFuzz/CodeGen.hs
index a743f0f..62a604c 100644
--- a/src/Test/VeriFuzz/CodeGen.hs
+++ b/src/Test/VeriFuzz/CodeGen.hs
@@ -2,8 +2,9 @@
module Test.VeriFuzz.CodeGen where
-import Data.Graph.Inductive (Graph, LNode, Node, indeg, nodes, outdeg,
- pre)
+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
@@ -17,16 +18,32 @@ filterGr graph f =
fromList :: [Text] -> Text
fromList = foldl mappend empty
+safeTail :: [a] -> Maybe [a]
+safeTail [] = Nothing
+safeTail l = Just $ tail l
+
+safeHead :: [a] -> Maybe a
+safeHead [] = Nothing
+safeHead l = Just $ head l
+
toOperator :: Gate -> Text
toOperator And = " & "
toOperator Or = " | "
toOperator Xor = " ^ "
+statList :: Gate -> [Node] -> Maybe Text
+statList g n = toStr <$> safeTail n
+ where
+ toStr = fromList . map ((<> toOperator g) . fromNode)
+
+lastEl :: [Node] -> Maybe Text
+lastEl n = fromNode <$> safeHead n
+
toStatement :: (Graph gr) => gr Gate e -> LNode Gate -> Text
toStatement graph (n, g) =
- fromNode n <> " = " <> connNodes <> ";\n"
+ fromMaybe empty $ Just " assign " <> Just (fromNode n) <> Just " = " <> statList g nodeL <> lastEl nodeL <> Just ";\n"
where
- connNodes = fromList . map ((<> toOperator g) . fromNode) $ pre graph n
+ nodeL = pre graph n
generate :: (Graph gr) => gr Gate e -> Text
generate graph =
@@ -34,6 +51,7 @@ generate graph =
<> fromList (imap " input wire " ",\n" inp)
<> fromList (imap " output wire " ",\n" out)
<> ");\n"
+ <> fromList (map (toStatement graph) (labNodes graph))
<> "endmodule\n\nmodule main;\n initial\n begin\n "
<> "$display(\"Hello, world\");\n $finish;\n "
<> "end\nendmodule"