From 9bb2f6d5a8815ec10f83e917395ac511a153e6f2 Mon Sep 17 00:00:00 2001 From: Yann Herklotz Date: Fri, 16 Nov 2018 21:17:29 +0000 Subject: Basic generation with errors --- src/Test/VeriFuzz/CodeGen.hs | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) (limited to 'src/Test/VeriFuzz/CodeGen.hs') 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" -- cgit