import Control.Monad (when) import qualified Data.ByteString.Char8 as BS import Data.List (elemIndex, intercalate) import Data.Maybe (isNothing, catMaybes, fromJust) import System.Environment (getArgs) import Data.Avc main = do args <- getArgs when (null args) $ error "Usage SelectSigs file.avc sig1 sig2 ..." let filename:sigNames = args statements <- parseAvcFile filename -- TODO: catch exception when no FORMAT found let format = head $ filter isFormat statements let midxs = getSigIdxs format (map BS.pack sigNames) when (Nothing `elem` midxs) $ error $ "Signals not found in format: " ++ nameMissingSignals midxs sigNames let idxs = catMaybes midxs let sigs = map (Sig . BS.pack) sigNames -- BS.putStrLn $ toString $ Format sigs CNil mapM (BS.putStrLn . toString) $ selectSigs idxs statements selectSigs :: [Int] -> [Statement] -> [Statement] selectSigs idxs = map selectSigs' where selectSigs' (Format sigs comment) = Format (map (sigs !!) idxs) comment selectSigs' (Repeat rep cyc vec comment) = Repeat rep cyc (BS.pack (map (vec `BS.index`) idxs)) comment selectSigs' EOF = EOF nameMissingSignals :: [Maybe Int] -> [String] -> String nameMissingSignals mi ss = let z = zip mi ss f = filter (isNothing . fst) z ms = map snd f in intercalate ", " ms getSigIdxs :: Statement -> [BS.ByteString] -> [Maybe Int] getSigIdxs format = map (`elemIndex` sigNames format) where sigNames (Format sigs _) = map sigName sigs sigName (Sig name) = name isFormat (Format{}) = True isFormat _ = False