-- | -- Module : Verismith.Tool.Vivado -- Description : Vivado Synthesiser implementation. -- Copyright : (c) 2019, Yann Herklotz Grave -- License : GPL-3 -- Maintainer : yann [at] yannherklotz [dot] com -- Stability : experimental -- Portability : POSIX -- -- Vivado Synthesiser implementation. module Verismith.Tool.Vivado ( Vivado (..), defaultVivado, ) 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 Vivado = Vivado { vivadoBin :: !(Maybe FilePath), vivadoDesc :: !Text, vivadoOutput :: !FilePath } deriving (Eq) instance Tool Vivado where toText (Vivado _ t _) = t instance Show Vivado where show t = unpack $ toText t instance Synthesiser Vivado where runSynth = runSynthVivado synthOutput = vivadoOutput setSynthOutput (Vivado a b _) = Vivado a b instance NFData Vivado where rnf = rwhnf defaultVivado :: Vivado defaultVivado = Vivado Nothing "vivado" "syn_vivado.v" runSynthVivado :: Show ann => Vivado -> (SourceInfo ann) -> ResultSh () runSynthVivado sim (SourceInfo top src) = do dir <- liftSh pwd liftSh $ do writefile vivadoTcl . vivadoSynthConfig top . toTextIgnore $ synthOutput sim writefile "rtl.v" $ genSource src run_ "sed" [ "s/^module/(* use_dsp48=\"no\" *) (* use_dsp=\"no\" *) module/;", "-i", "rtl.v" ] let exec_ n = execute_ SynthFail dir "vivado" (maybe (fromText n) ( fromText n) $ vivadoBin sim) exec_ "vivado" ["-mode", "batch", "-source", toTextIgnore vivadoTcl] where vivadoTcl = fromText ("vivado_" <> top) <.> "tcl"