sv2v/src/Convert.hs

177 lines
5.5 KiB
Haskell
Raw Normal View History

{- sv2v
- Author: Zachary Snow <zach@zachjs.com>
-
- SystemVerilog to Verilog conversion
-}
module Convert (convert) where
2021-09-06 01:54:36 +02:00
import Control.Monad ((>=>))
import Language.SystemVerilog.AST
import qualified Job (Exclude(..))
import qualified Convert.AlwaysKW
import qualified Convert.AsgnOp
import qualified Convert.Assertion
import qualified Convert.BlockDecl
import qualified Convert.Cast
import qualified Convert.DimensionQuery
2022-03-11 11:32:54 +01:00
import qualified Convert.DoWhile
2020-02-24 04:30:17 +01:00
import qualified Convert.DuplicateGenvar
import qualified Convert.EmptyArgs
2019-03-01 04:44:31 +01:00
import qualified Convert.Enum
import qualified Convert.EventEdge
2022-03-12 23:57:17 +01:00
import qualified Convert.ExprAsgn
import qualified Convert.ForAsgn
2019-09-15 21:49:21 +02:00
import qualified Convert.Foreach
import qualified Convert.FuncRet
import qualified Convert.FuncRoutine
import qualified Convert.GenvarName
import qualified Convert.HierConst
import qualified Convert.ImplicitNet
import qualified Convert.Inside
2019-03-07 02:30:47 +01:00
import qualified Convert.Interface
import qualified Convert.IntTypes
import qualified Convert.Jump
import qualified Convert.KWArgs
import qualified Convert.Logic
2019-09-15 19:55:40 +02:00
import qualified Convert.LogOp
import qualified Convert.MultiplePacked
import qualified Convert.NamedBlock
2019-04-24 02:22:03 +02:00
import qualified Convert.Package
import qualified Convert.ParamNoDefault
2019-09-11 09:27:18 +02:00
import qualified Convert.ParamType
import qualified Convert.PortDecl
import qualified Convert.RemoveComments
import qualified Convert.ResolveBindings
import qualified Convert.SeverityTask
import qualified Convert.Simplify
2019-09-04 05:36:29 +02:00
import qualified Convert.Stream
import qualified Convert.StringParam
import qualified Convert.StringType
import qualified Convert.Struct
import qualified Convert.StructConst
2020-05-06 01:32:37 +02:00
import qualified Convert.TFBlock
import qualified Convert.Typedef
import qualified Convert.TypeOf
import qualified Convert.UnbasedUnsized
import qualified Convert.Unique
import qualified Convert.UnnamedGenBlock
import qualified Convert.UnpackedArray
import qualified Convert.Unsigned
import qualified Convert.Wildcard
type Phase = [AST] -> [AST]
2021-09-06 01:54:36 +02:00
type IOPhase = [AST] -> IO [AST]
2021-02-08 18:42:34 +01:00
type Selector = Job.Exclude -> Phase -> Phase
2021-02-08 18:42:34 +01:00
finalPhases :: Selector -> [Phase]
finalPhases _ =
[ Convert.NamedBlock.convert
, Convert.DuplicateGenvar.convert
, Convert.AsgnOp.convert
, Convert.EmptyArgs.convert
, Convert.FuncRet.convert
, Convert.TFBlock.convert
, Convert.StringType.convert
2021-02-08 18:42:34 +01:00
]
mainPhases :: [String] -> Selector -> [Phase]
mainPhases tops selectExclude =
[ Convert.BlockDecl.convert
2021-02-08 18:42:34 +01:00
, selectExclude Job.Logic Convert.Logic.convert
, Convert.ImplicitNet.convert
, Convert.Inside.convert
, Convert.IntTypes.convert
, Convert.MultiplePacked.convert
, selectExclude Job.UnbasedUnsized Convert.UnbasedUnsized.convert
, Convert.Cast.convert
, Convert.ParamType.convert tops
, Convert.HierConst.convert
2020-01-12 02:35:51 +01:00
, Convert.TypeOf.convert
, Convert.DimensionQuery.convert
, Convert.Simplify.convert
2019-09-04 05:36:29 +02:00
, Convert.Stream.convert
, Convert.Struct.convert
2019-03-01 04:44:31 +01:00
, Convert.Typedef.convert
, Convert.UnpackedArray.convert
, Convert.Unsigned.convert
, Convert.Wildcard.convert
, Convert.Enum.convert
, Convert.StringParam.convert
, selectExclude Job.Interface $ Convert.Interface.convert tops
2021-02-08 18:42:34 +01:00
, selectExclude Job.Succinct Convert.RemoveComments.convert
2019-03-31 21:57:28 +02:00
]
initialPhases :: [String] -> Selector -> [Phase]
initialPhases tops selectExclude =
[ Convert.ForAsgn.convert
, Convert.Jump.convert
2022-03-12 23:57:17 +01:00
, Convert.ExprAsgn.convert
, Convert.KWArgs.convert
2021-02-08 18:42:34 +01:00
, Convert.Unique.convert
, Convert.EventEdge.convert
2021-02-08 18:42:34 +01:00
, Convert.LogOp.convert
2022-03-11 11:32:54 +01:00
, Convert.DoWhile.convert
2021-02-08 18:42:34 +01:00
, Convert.Foreach.convert
, Convert.FuncRoutine.convert
, Convert.GenvarName.convert
2021-02-08 18:42:34 +01:00
, selectExclude Job.Assert Convert.Assertion.convert
, selectExclude Job.Always Convert.AlwaysKW.convert
, Convert.Interface.disambiguate
, selectExclude Job.SeverityTask Convert.SeverityTask.convert
2021-02-08 18:42:34 +01:00
, Convert.Package.convert
, Convert.StructConst.convert
, Convert.PortDecl.convert
, Convert.ParamNoDefault.convert tops
, Convert.ResolveBindings.convert
, Convert.UnnamedGenBlock.convert
2021-02-08 18:42:34 +01:00
]
convert :: [String] -> FilePath -> [Job.Exclude] -> IOPhase
convert tops dumpPrefix excludes =
2021-09-06 01:54:36 +02:00
step "parse" id >=>
step "initial" initial >=>
loop 1 "main" main >=>
step "final" final
2019-02-26 21:03:49 +01:00
where
2021-02-08 18:42:34 +01:00
final = combine $ finalPhases selectExclude
main = combine $ mainPhases tops selectExclude
initial = combine $ initialPhases tops selectExclude
2021-02-08 18:42:34 +01:00
combine = foldr1 (.)
2021-09-06 01:54:36 +02:00
2021-02-08 18:42:34 +01:00
selectExclude :: Selector
selectExclude exclude phase =
if elem exclude excludes
then id
else phase
2021-09-06 01:54:36 +02:00
dumper :: String -> IOPhase
dumper =
if null dumpPrefix
then const return
else fileDumper dumpPrefix
-- add debug dumping to a phase
step :: String -> Phase -> IOPhase
step key = (dumper key .)
-- add convergence and debug dumping to a phase
loop :: Int -> String -> Phase -> IOPhase
loop idx key phase files =
if files == files'
then return files
else dumper key' files' >>= loop (idx + 1) key phase
where
files' = phase files
key' = key ++ "_" ++ show idx
-- pass through dumper which writes ASTs to a file
fileDumper :: String -> String -> IOPhase
fileDumper prefix key files = do
let path = prefix ++ key ++ ".sv"
let output = show $ concat files
writeFile path output
return files