blob: d922195ffb46e217c1893ee5a52a806790ef9391 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
{-# LANGUAGE OverloadedStrings #-}
module Test.VeriFuzz.CodeGen where
import Data.Graph.Inductive (Graph, Node, indeg, nodes, outdeg)
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
generate :: (Graph gr) => gr Gate e -> Text
generate graph =
"module generated_module(\n"
<> fromList (imap " " ",\n" inp)
<> fromList (imap " " ",\n" out)
<> ");\n"
<> fromList (imap " input wire " ";\n" inp)
<> fromList (imap " output wire " ";\n" out)
<> "endmodule\n\nmodule main;\n initial\n begin\n $display(\"Hello, world\");\n $finish;\n end\nendmodule"
where
and a b c = a == b && a /= c
inputs n = indeg graph n == 0 && outdeg graph n /= 0
outputs n = indeg graph n /= 0 && outdeg graph n == 0
fromList = foldl mappend empty
inp = filterGr graph inputs
out = filterGr graph outputs
imap b e = map ((\s -> b <> s <> e) . fromNode)
|