kansas-lava-0.2.4: tools/TBF2VCD.hs
module Main where
import Language.KansasLava.VCD
import Control.Applicative
import Data.Char as C
import System.Environment
main :: IO ()
main = do
cmds <- getArgs
main2 cmds
main2 :: [String] -> IO ()
main2 ["--diff",sig,inbits,outbits,vcd_out] = main4 sig inbits outbits vcd_out
main2 ["--clock",clk,sig,bits',vcd_out] | all C.isDigit clk
= main3 True (read clk) sig bits' vcd_out
main2 [clk,sig,bits',vcd_out] | all C.isDigit clk
= main3 False (read clk) sig bits' vcd_out
main2 _ = error $ "usage:\n kltbf2vcd [--clock] (clockrate-in-ns) <.sig-file> <.bits-file> <vcd-file>\n" ++
" kltbf2vcd --diff <.sig-file> <.left-bits-file> <.right-bits-file> <vcd-file>"
main3 :: Bool -> Integer -> FilePath -> FilePath -> FilePath -> IO ()
main3 ifClk clkRate sigName bitsName vcdFile = do
sig <- read <$> readFile sigName
str <- lines <$> readFile bitsName
writeVCDFile ifClk clkRate vcdFile $ readTBF str sig
main4 :: FilePath -> FilePath -> FilePath -> FilePath -> IO ()
main4 sigfile leftfile rightfile vcdFile = do
left <- lines <$> readFile leftfile
right <- lines <$> readFile rightfile
sig <- read <$> readFile sigfile
let t1 = readTBF left sig
t2 = readTBF right sig
vcdDiff t1 t2 vcdFile
vcdDiff :: VCD -> VCD -> FilePath -> IO ()
vcdDiff (VCD m1) (VCD m2) filePath = writeVCDFile False 10 filePath t
where t = VCD $ [ ("trace1_" ++ k,v) | (k,v) <- m1 ]
++
[ ("trace2_" ++ k,v) | (k,v) <- m2 ]