packages feed

quipper-tools-0.9.0.0: Quipper/Programs/Tools/Unbox.hs

-- ----------------------------------------------------------------------
-- | This tool unwinds a circuit by inlining all top-level boxed
-- subroutines.  It can sometimes be used to pre-process circuits for
-- use by other tools that may not yet work correctly with boxed
-- subroutines. Note, however, that this can substantially increase
-- the size of the circuit representation.
-- 
-- Note that only top-level boxed subroutines are inlined; the tool
-- may have to be applied several times to remove all levels of boxes.
-- 
-- This is only an illustration for how to write such tools; another
-- tool could be written that does \"deep\" unboxing.

module Main where

import Quipper
import Quipper.Libraries.QuipperASCIIParser
import Quipper.Libraries.Unboxing
import System.Environment
import System.Exit
import System.IO

-- | Print a usage message to 'stdout'.
usage :: IO ()
usage = do
  name <- getProgName
  putStr (header name)
    where header name =
            name ++ ": unwind a circuit by inlining all top-level boxed\n"
            ++ "subroutines. Only top-level boxed subroutines are inlined;\n"
            ++ "the tool may have to be applied several times to remove all\n"
            ++ "levels of boxes. This is only an illustration for how to write\n"
            ++ "such tools; another tool could be written that does \"deep\"\n"
            ++ "unboxing.\n"


-- | Main function: read from 'stdin', do the decomposition, and write
-- to 'stdout'.
main :: IO ()
main = do
  argv <- getArgs
  case argv of
    [] -> return ()
    "-h" : _ -> do
      usage
      exitSuccess
    "--help" : _ -> do
      usage
      exitSuccess
    o : _ -> do
      hPutStrLn stderr ("Bad argument or option: '" ++ o ++ "'. Try --help for more info.")
      exitFailure

  (ins,circuit) <- parse_from_stdin  
  let unboxed_circuit = unbox circuit
  print_generic ASCII unboxed_circuit ins