diff options
Diffstat (limited to 'src/VeriFuzz/Graph/CodeGen.hs')
-rw-r--r-- | src/VeriFuzz/Graph/CodeGen.hs | 55 |
1 files changed, 32 insertions, 23 deletions
diff --git a/src/VeriFuzz/Graph/CodeGen.hs b/src/VeriFuzz/Graph/CodeGen.hs index 57e7b2a..3c45a9c 100644 --- a/src/VeriFuzz/Graph/CodeGen.hs +++ b/src/VeriFuzz/Graph/CodeGen.hs @@ -12,13 +12,19 @@ Define the code generation directly from the random DAG. module VeriFuzz.Graph.CodeGen ( generate - ) where + ) +where -import Data.Foldable (fold) -import Data.Graph.Inductive (Graph, LNode, Node, labNodes, pre) -import Data.Maybe (fromMaybe) -import Data.Text (Text) -import qualified Data.Text as T +import Data.Foldable ( fold ) +import Data.Graph.Inductive ( Graph + , LNode + , Node + , labNodes + , pre + ) +import Data.Maybe ( fromMaybe ) +import Data.Text ( Text ) +import qualified Data.Text as T import VeriFuzz.Circuit import VeriFuzz.Internal.Gen import VeriFuzz.Internal.Shared @@ -30,30 +36,33 @@ toOperator Xor = " ^ " statList :: Gate -> [Node] -> Maybe Text statList g n = toStr <$> safe tail n - where - toStr = fold . fmap ((<> toOperator g) . fromNode) + where toStr = fold . fmap ((<> toOperator g) . fromNode) lastEl :: [Node] -> Maybe Text lastEl n = fromNode <$> safe head n toStmnt :: (Graph gr) => gr Gate e -> LNode Gate -> Text toStmnt graph (n, g) = - fromMaybe T.empty $ Just " assign " <> Just (fromNode n) - <> Just " = " <> statList g nodeL <> lastEl nodeL <> Just ";\n" - where - nodeL = pre graph n + fromMaybe T.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" - <> fold (imap " input wire " ",\n" inp) - <> T.intercalate ",\n" (imap " output wire " "" out) - <> ");\n" - <> fold (toStmnt graph <$> labNodes graph) - <> "endmodule\n\nmodule main;\n initial\n begin\n " - <> "$display(\"Hello, world\");\n $finish;\n " - <> "end\nendmodule" - where - inp = inputs graph - out = outputs graph - imap b e = fmap ((\s -> b <> s <> e) . fromNode) + <> fold (imap " input wire " ",\n" inp) + <> T.intercalate ",\n" (imap " output wire " "" out) + <> ");\n" + <> fold (toStmnt graph <$> labNodes graph) + <> "endmodule\n\nmodule main;\n initial\n begin\n " + <> "$display(\"Hello, world\");\n $finish;\n " + <> "end\nendmodule" + where + inp = inputs graph + out = outputs graph + imap b e = fmap ((\s -> b <> s <> e) . fromNode) |