{-# LANGUAGE QuasiQuotes #-}
module Verismith.Tool.XST
( XST (..),
defaultXST,
)
where
import Control.DeepSeq (NFData, rnf, rwhnf)
import Data.Text (Text, unpack)
import Shelly
import Shelly.Lifted (liftSh)
import Verismith.Tool.Internal
import Verismith.Tool.Template
import Verismith.Verilog.AST
import Verismith.Verilog.CodeGen
import Prelude hiding (FilePath)
data XST = XST
{ XST -> Maybe FilePath
xstBin :: !(Maybe FilePath),
XST -> Text
xstDesc :: !Text,
XST -> FilePath
xstOutput :: !FilePath
}
deriving (XST -> XST -> Bool
(XST -> XST -> Bool) -> (XST -> XST -> Bool) -> Eq XST
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: XST -> XST -> Bool
== :: XST -> XST -> Bool
$c/= :: XST -> XST -> Bool
/= :: XST -> XST -> Bool
Eq)
instance Tool XST where
toText :: XST -> Text
toText (XST Maybe FilePath
_ Text
t FilePath
_) = Text
t
instance Show XST where
show :: XST -> FilePath
show XST
t = Text -> FilePath
unpack (Text -> FilePath) -> Text -> FilePath
forall a b. (a -> b) -> a -> b
$ XST -> Text
forall a. Tool a => a -> Text
toText XST
t
instance Synthesiser XST where
runSynth :: forall ann. Show ann => XST -> SourceInfo ann -> ResultSh ()
runSynth = XST -> SourceInfo ann -> ResultSh ()
forall ann. Show ann => XST -> SourceInfo ann -> ResultSh ()
runSynthXST
synthOutput :: XST -> FilePath
synthOutput = XST -> FilePath
xstOutput
setSynthOutput :: XST -> FilePath -> XST
setSynthOutput (XST Maybe FilePath
a Text
b FilePath
_) = Maybe FilePath -> Text -> FilePath -> XST
XST Maybe FilePath
a Text
b
instance NFData XST where
rnf :: XST -> ()
rnf = XST -> ()
forall a. a -> ()
rwhnf
defaultXST :: XST
defaultXST :: XST
defaultXST = Maybe FilePath -> Text -> FilePath -> XST
XST Maybe FilePath
forall a. Maybe a
Nothing Text
"xst" FilePath
"syn_xst.v"
runSynthXST :: (Show ann) => XST -> (SourceInfo ann) -> ResultSh ()
runSynthXST :: forall ann. Show ann => XST -> SourceInfo ann -> ResultSh ()
runSynthXST XST
sim (SourceInfo Text
top Verilog ann
src) = do
FilePath
dir <- Sh FilePath -> ResultT Failed Sh FilePath
forall a. Sh a -> ResultT Failed Sh a
forall (m :: * -> *) a. MonadSh m => Sh a -> m a
liftSh Sh FilePath
pwd
let exec :: Text -> [Text] -> ResultT Failed m ()
exec Text
n =
Failed
-> FilePath -> Text -> FilePath -> [Text] -> ResultT Failed m ()
forall (m :: * -> *).
(MonadSh m, Monad m) =>
Failed
-> FilePath -> Text -> FilePath -> [Text] -> ResultT Failed m ()
execute_
Failed
SynthFail
FilePath
dir
Text
"xst"
(FilePath -> ShowS -> Maybe FilePath -> FilePath
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Text -> FilePath
fromText Text
n) (FilePath -> ShowS
forall filepath1 filepath2.
(ToFilePath filepath1, ToFilePath filepath2) =>
filepath1 -> filepath2 -> FilePath
</> Text -> FilePath
fromText Text
n) (Maybe FilePath -> FilePath) -> Maybe FilePath -> FilePath
forall a b. (a -> b) -> a -> b
$ XST -> Maybe FilePath
xstBin XST
sim)
Sh () -> ResultSh ()
forall a. Sh a -> ResultT Failed Sh a
forall (m :: * -> *) a. MonadSh m => Sh a -> m a
liftSh (Sh () -> ResultSh ()) -> Sh () -> ResultSh ()
forall a b. (a -> b) -> a -> b
$ do
FilePath -> Text -> Sh ()
writefile FilePath
xstFile (Text -> Sh ()) -> Text -> Sh ()
forall a b. (a -> b) -> a -> b
$ Text -> Text
xstSynthConfig Text
top
FilePath -> Text -> Sh ()
writefile FilePath
prjFile Text
"verilog work \"rtl.v\""
FilePath -> Text -> Sh ()
writefile FilePath
"rtl.v" (Text -> Sh ()) -> Text -> Sh ()
forall a b. (a -> b) -> a -> b
$ Verilog ann -> Text
forall a. Source a => a -> Text
genSource Verilog ann
src
Text -> [Text] -> ResultSh ()
forall {m :: * -> *}.
MonadSh m =>
Text -> [Text] -> ResultT Failed m ()
exec Text
"xst" [Text
"-ifn", FilePath -> Text
toTextIgnore FilePath
xstFile]
Text -> [Text] -> ResultSh ()
forall {m :: * -> *}.
MonadSh m =>
Text -> [Text] -> ResultT Failed m ()
exec
Text
"netgen"
[ Text
"-w",
Text
"-ofmt",
Text
"verilog",
FilePath -> Text
toTextIgnore (FilePath -> Text) -> FilePath -> Text
forall a b. (a -> b) -> a -> b
$ FilePath
modFile FilePath -> Text -> FilePath
forall filepath.
ToFilePath filepath =>
filepath -> Text -> FilePath
<.> Text
"ngc",
FilePath -> Text
toTextIgnore (FilePath -> Text) -> FilePath -> Text
forall a b. (a -> b) -> a -> b
$ XST -> FilePath
forall a. Synthesiser a => a -> FilePath
synthOutput XST
sim
]
Sh () -> ResultSh ()
forall a. Sh a -> ResultT Failed Sh a
forall (m :: * -> *) a. MonadSh m => Sh a -> m a
liftSh (Sh () -> ResultSh ()) -> (Sh () -> Sh ()) -> Sh () -> ResultSh ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sh () -> Sh ()
forall a. Sh a -> Sh a
noPrint (Sh () -> ResultSh ()) -> Sh () -> ResultSh ()
forall a b. (a -> b) -> a -> b
$
FilePath -> [Text] -> Sh ()
run_
FilePath
"sed"
[ Text
"-i",
Text
"/^`ifndef/,/^`endif/ d; s/ *Timestamp: .*//;",
FilePath -> Text
toTextIgnore (FilePath -> Text) -> FilePath -> Text
forall a b. (a -> b) -> a -> b
$ XST -> FilePath
forall a. Synthesiser a => a -> FilePath
synthOutput XST
sim
]
where
modFile :: FilePath
modFile = Text -> FilePath
fromText Text
top
xstFile :: FilePath
xstFile = FilePath
modFile FilePath -> Text -> FilePath
forall filepath.
ToFilePath filepath =>
filepath -> Text -> FilePath
<.> Text
"xst"
prjFile :: FilePath
prjFile = FilePath
modFile FilePath -> Text -> FilePath
forall filepath.
ToFilePath filepath =>
filepath -> Text -> FilePath
<.> Text
"prj"