aboutsummaryrefslogtreecommitdiffstats
path: root/src/VeriFuzz/Verilog/CodeGen.hs
diff options
context:
space:
mode:
authorYann Herklotz <ymherklotz@gmail.com>2019-02-01 13:04:11 +0000
committerYann Herklotz <ymherklotz@gmail.com>2019-02-01 13:04:11 +0000
commit4964c632a434a0b41f645c45223ee12f2bdac80e (patch)
tree4ee82039c44642f542872308ce994b25e1a607f7 /src/VeriFuzz/Verilog/CodeGen.hs
parent6920285fd26ad50513f9b867a5bd25b8b14c2116 (diff)
downloadverismith-4964c632a434a0b41f645c45223ee12f2bdac80e.tar.gz
verismith-4964c632a434a0b41f645c45223ee12f2bdac80e.zip
[Fix #27] Add function to Expr and add Generation type
Diffstat (limited to 'src/VeriFuzz/Verilog/CodeGen.hs')
-rw-r--r--src/VeriFuzz/Verilog/CodeGen.hs18
1 files changed, 17 insertions, 1 deletions
diff --git a/src/VeriFuzz/Verilog/CodeGen.hs b/src/VeriFuzz/Verilog/CodeGen.hs
index 8b574c2..3253f86 100644
--- a/src/VeriFuzz/Verilog/CodeGen.hs
+++ b/src/VeriFuzz/Verilog/CodeGen.hs
@@ -21,6 +21,7 @@ import Data.Text (Text)
import qualified Data.Text as T
import qualified Data.Text.IO as T
import Numeric (showHex)
+import Test.QuickCheck (Arbitrary, arbitrary)
import VeriFuzz.Verilog.AST
-- | 'Source' class which determines that source code is able to be generated
@@ -105,14 +106,21 @@ genContAssign (ContAssign val e) = "assign " <> name <> " = " <> expr <> ";\n"
name = val ^. getIdentifier
expr = genExpr e
+-- | Generate 'Function' to 'Text'
+genFunc :: Function -> Text
+genFunc SignedFunc = "$signed"
+genFunc UnSignedFunc = "$unsigned"
+
-- | Generate 'Expr' to 'Text'.
genExpr :: Expr -> Text
genExpr (BinOp eRhs bin eLhs) = "(" <> genExpr eRhs <> genBinaryOperator bin <> genExpr eLhs <> ")"
-genExpr (Number s n ) = showT s <> "'h" <> T.pack (showHex n "")
+genExpr (Number s n ) = minus <> showT s <> "'h" <> T.pack (showHex (abs n) "")
+ where minus | signum n > 0 = "" | otherwise = "-"
genExpr (Id i ) = i ^. getIdentifier
genExpr (Concat c ) = "{" <> comma (genExpr <$> c) <> "}"
genExpr (UnOp u e ) = "(" <> genUnaryOperator u <> genExpr e <> ")"
genExpr (Cond l t f ) = "(" <> genExpr l <> " ? " <> genExpr t <> " : " <> genExpr f <> ")"
+genExpr (Func f e ) = genFunc f <> "(" <> genExpr e <> ")"
genExpr (Str t ) = "\"" <> t <> "\""
-- | Convert 'BinaryOperator' to 'Text'.
@@ -258,3 +266,11 @@ instance Source Description where
instance Source VerilogSrc where
genSource = genVerilogSrc
+
+newtype GenVerilog a = GenVerilog { unGenVerilog :: a }
+
+instance (Source a) => Show (GenVerilog a) where
+ show = T.unpack . genSource . unGenVerilog
+
+instance (Arbitrary a) => Arbitrary (GenVerilog a) where
+ arbitrary = GenVerilog <$> arbitrary