sv2v/src/Convert.hs

129 lines
3.9 KiB
Haskell
Raw Normal View History

{- sv2v
- Author: Zachary Snow <zach@zachjs.com>
-
- SystemVerilog to Verilog conversion
-}
module Convert (convert) where
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
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.ForDecl
2019-09-15 21:49:21 +02:00
import qualified Convert.Foreach
import qualified Convert.FuncRet
import qualified Convert.FuncRoutine
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.RemoveComments
import qualified Convert.Simplify
2019-02-20 21:22:26 +01:00
import qualified Convert.StarPort
2019-09-04 05:36:29 +02:00
import qualified Convert.Stream
import qualified Convert.StringParam
import qualified Convert.Struct
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.UnpackedArray
import qualified Convert.Unsigned
import qualified Convert.Wildcard
type Phase = [AST] -> [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
]
mainPhases :: Selector -> [Phase]
mainPhases selectExclude =
[ Convert.AsgnOp.convert
, Convert.BlockDecl.convert
2021-02-08 18:42:34 +01:00
, selectExclude Job.Logic Convert.Logic.convert
, Convert.FuncRet.convert
, Convert.FuncRoutine.convert
, Convert.EmptyArgs.convert
, Convert.ImplicitNet.convert
, Convert.Inside.convert
, Convert.IntTypes.convert
, Convert.KWArgs.convert
, Convert.MultiplePacked.convert
, Convert.UnbasedUnsized.convert
, Convert.Cast.convert
, Convert.HierConst.convert
2020-01-12 02:35:51 +01:00
, Convert.TypeOf.convert
, Convert.DimensionQuery.convert
2019-09-11 09:27:18 +02:00
, Convert.ParamType.convert
, Convert.Simplify.convert
2019-09-04 05:36:29 +02:00
, Convert.Stream.convert
, Convert.Struct.convert
2020-05-06 01:32:37 +02:00
, Convert.TFBlock.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.ForDecl.convert
, Convert.StringParam.convert
2021-02-08 18:42:34 +01:00
, selectExclude Job.Interface Convert.Interface.convert
, selectExclude Job.Succinct Convert.RemoveComments.convert
2019-03-31 21:57:28 +02:00
]
2021-02-08 18:42:34 +01:00
initialPhases :: Selector -> [Phase]
initialPhases selectExclude =
[ Convert.Jump.convert
, Convert.Unique.convert
, Convert.LogOp.convert
, Convert.Foreach.convert
, Convert.StarPort.convert
, selectExclude Job.Assert Convert.Assertion.convert
, selectExclude Job.Always Convert.AlwaysKW.convert
, Convert.Package.convert
, Convert.ParamNoDefault.convert
]
convert :: [Job.Exclude] -> Phase
convert excludes =
2021-02-08 18:42:34 +01:00
final . loopMain . initial
2019-02-26 21:03:49 +01:00
where
2021-02-08 18:42:34 +01:00
final = combine $ finalPhases selectExclude
main = combine $ mainPhases selectExclude
initial = combine $ initialPhases selectExclude
combine = foldr1 (.)
loopMain :: Phase
loopMain descriptions =
2019-02-26 21:03:49 +01:00
if descriptions == descriptions'
then descriptions
2021-02-08 18:42:34 +01:00
else loopMain descriptions'
where descriptions' = main descriptions
selectExclude :: Selector
selectExclude exclude phase =
if elem exclude excludes
then id
else phase