module Development.KansasLava.Shake.Xilinx
( XilinxConfig(..), XilinxTarget(..)
, xilinxRules
) where
import Development.Shake
import Development.Shake.FilePath
import qualified Data.Text.Lazy as TL
import Text.Hastache
import Text.Hastache.Context
import Paths_kansas_lava_shake
data XilinxTarget = XilinxTarget{ targetFamily, targetDevice, targetSpeed, targetPackage :: String }
data XilinxConfig = XilinxConfig{ xilinxRoot :: FilePath
, xilinxTarget :: XilinxTarget
}
xilinxRules :: XilinxConfig -> FilePath -> String -> [FilePath] -> [FilePath] -> Rules ()
xilinxRules XilinxConfig{..} outDir projName srcs ipcores = do
outDir </> projName <.> "bit" %> \_out -> do
need . concat $ [ [ outDir </> src | src <- srcs ]
, [ outDir </> "ipcore_dir" </> xco | xco <- ipcores ]
, [ outDir </> projName <.> "tcl" ]
]
xilinx "xtclsh" [projName <.> "tcl", "rebuild_project"]
"build" </> "*.tcl" %> do
hastache projCtxt
where
xilinx tool args = cmd (Cwd outDir) (xilinxRoot </> tool) args
projCtxt = mkStrContext $ \key -> case key of
"project" -> MuVariable projName
"targetFamily" -> MuVariable targetFamily
"targetDevice" -> MuVariable targetDevice
"targetSpeed" -> MuVariable targetSpeed
"targetPackage" -> MuVariable targetPackage
"ipcores" -> MuList [ mkStrContext $ \key -> case key of
"name" -> MuVariable name
_ -> MuNothing
| xco <- ipcores
, let name = dropExtension xco
]
"srcs" -> MuList [ mkStrContext $ \key -> case key of
"fileName" -> MuVariable src
_ -> MuNothing
| src <- srcs
]
_ -> MuNothing
where
XilinxTarget{..} = xilinxTarget
hastache :: MuContext IO -> FilePath -> Action ()
hastache ctxt target = do
alwaysRerun
templateFile <- liftIO $ getDataFileName ("ise.template" </> templateName)
t <- liftIO $ hastacheFile hastacheConfig templateFile ctxt
writeFileChanged target $ TL.unpack t
where
hastacheConfig = MuConfig{ muEscapeFunc = emptyEscape
, muTemplateFileDir = Nothing
, muTemplateFileExt = Just "mustache"
, muTemplateRead = const $ return Nothing
}
ext = drop 1 . takeExtension $ target
templateName = ext <.> "mustache"