{-# LANGUAGE Safe #-} module RWC (main) where import Driver (driverMain) import ReWire.Flags (Flag (..)) import ReWire.FrontEnd (compileFile) import System.Console.GetOpt (OptDescr (..), ArgDescr (..)) options :: [OptDescr Flag] options :: [OptDescr Flag] options = [ [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [Char 'h'] [[Char] "help"] (Flag -> ArgDescr Flag forall a. a -> ArgDescr a NoArg Flag FlagHelp) [Char] "This help message." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [Char 'v'] [[Char] "verbose"] (Flag -> ArgDescr Flag forall a. a -> ArgDescr a NoArg Flag FlagVerbose) [Char] "More verbose output." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [Char 'w'] [[Char] "no-warn"] (Flag -> ArgDescr Flag forall a. a -> ArgDescr a NoArg Flag FlagNoWarn) [Char] "Suppress warnings." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [Char 'W'] [] (([Char] -> Flag) -> [Char] -> ArgDescr Flag forall a. ([Char] -> a) -> [Char] -> ArgDescr a ReqArg [Char] -> Flag FlagW [Char] "error") [Char] "-Werror: treat warnings as errors." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [] [[Char] "verilog"] (Flag -> ArgDescr Flag forall a. a -> ArgDescr a NoArg Flag FlagVerilog) [Char] "Produce Verilog output (default)." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [] [[Char] "vhdl"] (Flag -> ArgDescr Flag forall a. a -> ArgDescr a NoArg Flag FlagVhdl) [Char] "Produce VHDL output." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [] [[Char] "cryptol"] (Flag -> ArgDescr Flag forall a. a -> ArgDescr a NoArg Flag FlagCryptol) [Char] "Produce Cryptol output (a pure model of the device for verification or simulation)." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [] [[Char] "from-core"] (Flag -> ArgDescr Flag forall a. a -> ArgDescr a NoArg Flag FlagFromCore) [Char] "Ingest ReWire core language files instead of Haskell." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [] [[Char] "core"] (Flag -> ArgDescr Flag forall a. a -> ArgDescr a NoArg Flag FlagCore) [Char] "Produce ReWire core language (Hyle) output; see doc/hyle.md." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [] [[Char] "invert-reset"] (Flag -> ArgDescr Flag forall a. a -> ArgDescr a NoArg Flag FlagInvertReset) [Char] "Invert the implicitly generated reset signal." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [] [[Char] "no-reset"] (Flag -> ArgDescr Flag forall a. a -> ArgDescr a NoArg Flag FlagNoReset) [Char] "No implicitly generated reset signal." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [] [[Char] "no-clock"] (Flag -> ArgDescr Flag forall a. a -> ArgDescr a NoArg Flag FlagNoClock) [Char] "No implicitly generated clock signal (implies no-reset: generate a purely combinatorial circuit)." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [] [[Char] "sync-reset"] (Flag -> ArgDescr Flag forall a. a -> ArgDescr a NoArg Flag FlagSyncReset) [Char] "Only reset on positive clock edge." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [Char 'd'] [[Char] "dump"] (([Char] -> Flag) -> [Char] -> ArgDescr Flag forall a. ([Char] -> a) -> [Char] -> ArgDescr a ReqArg [Char] -> Flag FlagDump [Char] "1,2,...") [Char] "Dump the IR after the given passes (see -v for pass numbers) to files beside the output (e.g., foo.6.eir, foo.8.syn); -v adds the show output in a comment." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [] [[Char] "dump-all"] (Flag -> ArgDescr Flag forall a. a -> ArgDescr a NoArg Flag FlagDumpAll) [Char] "Dump the IR after every pass (see -d)." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [] [[Char] "debug-lint"] (Flag -> ArgDescr Flag forall a. a -> ArgDescr a NoArg Flag FlagDebugLint) [Char] "Re-lint the IR after every Eidos and Synolon pass to possibly catch compiler bugs." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [] [[Char] "eidos"] (Flag -> ArgDescr Flag forall a. a -> ArgDescr a NoArg Flag FlagEidos) [Char] "Dump the Eidos IR after its last pass (.eir) beside the output; see doc/eidos.md." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [] [[Char] "synolon"] (Flag -> ArgDescr Flag forall a. a -> ArgDescr a NoArg Flag FlagSynolon) [Char] "Dump the Synolon IR after its last pass (.syn) beside the output; see doc/synolon.md." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [] [[Char] "certify"] ((Maybe [Char] -> Flag) -> [Char] -> ArgDescr Flag forall a. (Maybe [Char] -> a) -> [Char] -> ArgDescr a OptArg Maybe [Char] -> Flag FlagCertify [Char] "required|warn") [Char] "Validate the compiled device against the Synolon IR with the formally verified validator (rwv-cstep-validate); compilation fails unless the validator returns VALIDATED (--certify=warn reports the verdict without failing); see doc/certify.md." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [] [[Char] "no-halt"] (Flag -> ArgDescr Flag forall a. a -> ArgDescr a NoArg Flag FlagNoHalt) [Char] "Reject a device that can halt (post-halt outputs are unspecified; a rejected device must pause forever instead)." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [] [[Char] "flatten"] (Flag -> ArgDescr Flag forall a. a -> ArgDescr a NoArg Flag FlagFlatten) [Char] "Flatten RTL output into a single module (currently slow, memory-intensive)." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [Char 'o'] [] (([Char] -> Flag) -> [Char] -> ArgDescr Flag forall a. ([Char] -> a) -> [Char] -> ArgDescr a ReqArg [Char] -> Flag FlagO [Char] "filename") [Char] "Name for output file." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [Char 'p'] [[Char] "vhdl-packages"] (([Char] -> Flag) -> [Char] -> ArgDescr Flag forall a. ([Char] -> a) -> [Char] -> ArgDescr a ReqArg [Char] -> Flag FlagVhdlPkgs [Char] "pkg1,pkg2,...") [Char] "Packages to use for external VHDL components (e.g., ieee.std_logic_1164.all)." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [] [[Char] "reset"] (([Char] -> Flag) -> [Char] -> ArgDescr Flag forall a. ([Char] -> a) -> [Char] -> ArgDescr a ReqArg [Char] -> Flag FlagResetName [Char] "name") [Char] "Name to use for reset signal in generated RTL." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [] [[Char] "clock"] (([Char] -> Flag) -> [Char] -> ArgDescr Flag forall a. ([Char] -> a) -> [Char] -> ArgDescr a ReqArg [Char] -> Flag FlagClockName [Char] "name") [Char] "Name to use for clock signal in generated RTL." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [] [[Char] "inputs"] (([Char] -> Flag) -> [Char] -> ArgDescr Flag forall a. ([Char] -> a) -> [Char] -> ArgDescr a ReqArg [Char] -> Flag FlagInputNames [Char] "name1,name2,...") [Char] "Names to use for input signals in generated RTL." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [] [[Char] "outputs"] (([Char] -> Flag) -> [Char] -> ArgDescr Flag forall a. ([Char] -> a) -> [Char] -> ArgDescr a ReqArg [Char] -> Flag FlagOutputNames [Char] "name1,name2,...") [Char] "Names to use for output signals in generated RTL." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [] [[Char] "states"] (([Char] -> Flag) -> [Char] -> ArgDescr Flag forall a. ([Char] -> a) -> [Char] -> ArgDescr a ReqArg [Char] -> Flag FlagStateNames [Char] "name1,name2,...") [Char] "Names to use for internal state signals." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [] [[Char] "start"] (([Char] -> Flag) -> [Char] -> ArgDescr Flag forall a. ([Char] -> a) -> [Char] -> ArgDescr a ReqArg [Char] -> Flag FlagStart [Char] "name") [Char] "Symbol to use for the definition of the top-level module (default: Main.start)." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [] [[Char] "top"] (([Char] -> Flag) -> [Char] -> ArgDescr Flag forall a. ([Char] -> a) -> [Char] -> ArgDescr a ReqArg [Char] -> Flag FlagTop [Char] "name") [Char] "Name to use for the top-level module in generated RTL (default: top_level)." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [] [[Char] "loadpath"] (([Char] -> Flag) -> [Char] -> ArgDescr Flag forall a. ([Char] -> a) -> [Char] -> ArgDescr a ReqArg [Char] -> Flag FlagLoadPath [Char] "dir1,dir2,...") [Char] "Additional directories for loadpath." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [] [[Char] "interpret"] ((Maybe [Char] -> Flag) -> [Char] -> ArgDescr Flag forall a. (Maybe [Char] -> a) -> [Char] -> ArgDescr a OptArg Maybe [Char] -> Flag FlagInterpret [Char] "inputs.yaml") [Char] "Interpret instead of compile, using inputs from the optional argument file (default: inputs.yaml)." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [] [[Char] "testbench"] ((Maybe [Char] -> Flag) -> [Char] -> ArgDescr Flag forall a. (Maybe [Char] -> a) -> [Char] -> ArgDescr a OptArg Maybe [Char] -> Flag FlagTestbench [Char] "inputs.yaml") [Char] "Also generate a testbench (foo_tb.sv/foo_tb.vhdl) driving inputs from the optional argument file (default: inputs.yaml) for --cycles cycles." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [] [[Char] "cycles"] (([Char] -> Flag) -> [Char] -> ArgDescr Flag forall a. ([Char] -> a) -> [Char] -> ArgDescr a ReqArg [Char] -> Flag FlagCycles [Char] "ncycles") [Char] "Number of cycles to interpret or simulate (default: the larger of 10 and the number of inputs in the inputs file)." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [] [[Char] "depth"] (([Char] -> Flag) -> [Char] -> ArgDescr Flag forall a. ([Char] -> a) -> [Char] -> ArgDescr a ReqArg [Char] -> Flag FlagEvalDepth [Char] "depth") [Char] "Partial evaluation depth. Higher values can cause non-termination. (default: 8)." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [] [[Char] "rtl-opt"] (([Char] -> Flag) -> [Char] -> ArgDescr Flag forall a. ([Char] -> a) -> [Char] -> ArgDescr a ReqArg [Char] -> Flag FlagRtlOpt [Char] "level") [Char] "RTL optimization level. Disable with 0. (default: 8)." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [] [[Char] "pretty"] (Flag -> ArgDescr Flag forall a. a -> ArgDescr a NoArg Flag FlagPretty) [Char] "Attempt to output prettier RTL at the expense of performance." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [] [[Char] "stable-names"] (Flag -> ArgDescr Flag forall a. a -> ArgDescr a NoArg Flag FlagStableNames) [Char] "Suffix machine-block names with their unique keys (always collision-free, machine-greppable) instead of collision-only readable names." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [] [[Char] "locators"] (Flag -> ArgDescr Flag forall a. a -> ArgDescr a NoArg Flag FlagLocators) [Char] "Emit source-locator comments (--@ file:line:col-line:col) in ReWire core (.rwc) output; --no-locators takes precedence." , [Char] -> [[Char]] -> ArgDescr Flag -> [Char] -> OptDescr Flag forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a Option [] [[Char] "no-locators"] (Flag -> ArgDescr Flag forall a. a -> ArgDescr a NoArg Flag FlagNoLocators) [Char] "Suppress source-locator and provenance comments in generated output." ] main :: IO () main :: IO () main = [Char] -> [OptDescr Flag] -> (Config -> [Char] -> IO ()) -> IO () driverMain [Char] "rwc" [OptDescr Flag] options Config -> [Char] -> IO () forall (m :: * -> *). MonadIO m => Config -> [Char] -> m () compileFile