sv2v/src/Convert.hs

60 lines
1.5 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 Job (Target(..))
import qualified Convert.AlwaysKW
import qualified Convert.AsgnOp
import qualified Convert.CaseKW
2019-03-01 04:44:31 +01:00
import qualified Convert.Enum
import qualified Convert.FuncRet
import qualified Convert.Logic
import qualified Convert.PackedArray
import qualified Convert.Return
import qualified Convert.SplitPortDecl
2019-02-20 21:22:26 +01:00
import qualified Convert.StarPort
import qualified Convert.Struct
import qualified Convert.Typedef
import qualified Convert.Unique
2019-02-18 09:59:17 +01:00
type Phase = AST -> AST
phases :: Target -> [Phase]
phases YOSYS =
[ Convert.AsgnOp.convert
, Convert.FuncRet.convert
, Convert.Enum.convert
, Convert.PackedArray.convert
2019-02-26 21:03:49 +01:00
, Convert.StarPort.convert
, Convert.Struct.convert
, Convert.Return.convert
2019-03-01 04:44:31 +01:00
, Convert.Typedef.convert
, Convert.Unique.convert
2019-02-26 21:03:49 +01:00
]
phases VTR =
(phases YOSYS) ++
[ Convert.AlwaysKW.convert
, Convert.CaseKW.convert
, Convert.Logic.convert
, Convert.SplitPortDecl.convert
]
run :: Target -> Phase
2019-02-26 21:03:49 +01:00
run target = foldr (.) id $ phases target
convert :: Target -> Phase
2019-02-26 21:03:49 +01:00
convert target = convert'
where
convert' :: Phase
convert' descriptions =
if descriptions == descriptions'
then descriptions
else convert' descriptions'
where descriptions' = run target descriptions