{-# 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