aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorYann Herklotz <ymherklotz@gmail.com>2018-12-01 16:47:41 +0000
committerYann Herklotz <ymherklotz@gmail.com>2018-12-01 16:47:41 +0000
commitbe971a09231643850874f30abb7a52af3fe50dce (patch)
tree1ac3360b1de2dd7fb3cd027b17cf43f67af2a9bd /src
parentc9f6568f57bc8fbf59795c328ec528e3d0cf62d8 (diff)
downloadverismith-be971a09231643850874f30abb7a52af3fe50dce.tar.gz
verismith-be971a09231643850874f30abb7a52af3fe50dce.zip
Add more code generation for expressions
Diffstat (limited to 'src')
-rw-r--r--src/Test/VeriFuzz/CodeGen.hs40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/Test/VeriFuzz/CodeGen.hs b/src/Test/VeriFuzz/CodeGen.hs
index 4e4fb8c..3cc6063 100644
--- a/src/Test/VeriFuzz/CodeGen.hs
+++ b/src/Test/VeriFuzz/CodeGen.hs
@@ -5,6 +5,7 @@ module Test.VeriFuzz.CodeGen where
import Control.Lens
import Data.Text (Text)
import qualified Data.Text as T
+import qualified Data.Text.IO as T
import Test.VeriFuzz.Internal.Shared
import Test.VeriFuzz.VerilogAST
@@ -18,3 +19,42 @@ genDescription desc =
genModuleDecl :: ModuleDecl -> Text
genModuleDecl mod =
+ "module " <> mod ^. moduleId . getIdentifier
+ <> "(\n" <> ports <> "\n);\nendomodule"
+ where
+ ports = sep ",\n" $ genPort <$> mod ^. modPorts
+
+genPort :: Port -> Text
+genPort port =
+ " " <> dir <> " " <> name
+ where
+ dir = genPortDir $ port ^. portDir
+ name = port ^. portName . getIdentifier
+
+genPortDir :: PortDir -> Text
+genPortDir Input = "input"
+genPortDir Output = "output"
+genPortDir InOut = "inout"
+
+genModuleItem :: ModuleItem -> Text
+genModuleItem (Assign assign) = genContAssign assign
+
+genContAssign :: ContAssign -> Text
+genContAssign assign =
+ " assign " <> name <> " = " <> expr <> ";\n"
+ where
+ name = assign ^. contAssignNetLVal . getIdentifier
+ expr = genExpr $ assign ^. contAssignExpr
+
+genExpr :: Expression -> Text
+genExpr (OpExpr exprRhs bin exprLhs) =
+ genExpr exprRhs <> genBinaryOperator bin <> genExpr exprLhs
+genExpr _ = "TODO"
+
+genBinaryOperator :: BinaryOperator -> Text
+genBinaryOperator BinAnd = " & "
+genBinaryOperator BinOr = " | "
+genBinaryOperator BinXor = " ^ "
+
+render :: Text -> IO ()
+render = T.putStrLn