2019-02-18 05:39:01 +01:00
|
|
|
{- sv2v
|
|
|
|
|
- Author: Zachary Snow <zach@zachjs.com>
|
|
|
|
|
-
|
|
|
|
|
- SystemVerilog to Verilog conversion
|
|
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
module Convert (convert) where
|
|
|
|
|
|
|
|
|
|
import Language.SystemVerilog.AST
|
2019-02-28 20:06:35 +01:00
|
|
|
import Job (Target(..))
|
2019-02-18 05:39:01 +01:00
|
|
|
|
2019-02-18 07:38:16 +01:00
|
|
|
import qualified Convert.AlwaysKW
|
2019-03-05 01:58:54 +01:00
|
|
|
import qualified Convert.AsgnOp
|
2019-02-23 21:10:25 +01:00
|
|
|
import qualified Convert.CaseKW
|
2019-03-01 04:44:31 +01:00
|
|
|
import qualified Convert.Enum
|
2019-03-06 20:36:16 +01:00
|
|
|
import qualified Convert.FuncRet
|
2019-02-18 07:38:16 +01:00
|
|
|
import qualified Convert.Logic
|
2019-02-28 06:16:53 +01:00
|
|
|
import qualified Convert.PackedArray
|
2019-03-06 06:51:09 +01:00
|
|
|
import qualified Convert.Return
|
2019-02-26 06:40:50 +01:00
|
|
|
import qualified Convert.SplitPortDecl
|
2019-02-20 21:22:26 +01:00
|
|
|
import qualified Convert.StarPort
|
2019-03-06 06:51:09 +01:00
|
|
|
import qualified Convert.Struct
|
2019-03-05 00:25:14 +01:00
|
|
|
import qualified Convert.Typedef
|
|
|
|
|
import qualified Convert.Unique
|
2019-02-18 05:39:01 +01:00
|
|
|
|
2019-02-18 09:59:17 +01:00
|
|
|
type Phase = AST -> AST
|
2019-02-18 05:39:01 +01:00
|
|
|
|
2019-02-28 20:06:35 +01:00
|
|
|
phases :: Target -> [Phase]
|
|
|
|
|
phases YOSYS =
|
2019-03-05 01:58:54 +01:00
|
|
|
[ Convert.AsgnOp.convert
|
2019-03-06 20:36:16 +01:00
|
|
|
, Convert.FuncRet.convert
|
2019-03-05 01:58:54 +01:00
|
|
|
, Convert.Enum.convert
|
2019-02-28 06:16:53 +01:00
|
|
|
, Convert.PackedArray.convert
|
2019-02-26 21:03:49 +01:00
|
|
|
, Convert.StarPort.convert
|
2019-03-06 06:51:09 +01:00
|
|
|
, Convert.Struct.convert
|
|
|
|
|
, Convert.Return.convert
|
2019-03-01 04:44:31 +01:00
|
|
|
, Convert.Typedef.convert
|
2019-03-05 00:25:14 +01:00
|
|
|
, Convert.Unique.convert
|
2019-02-26 21:03:49 +01:00
|
|
|
]
|
2019-02-28 20:06:35 +01:00
|
|
|
phases VTR =
|
|
|
|
|
(phases YOSYS) ++
|
2019-02-18 07:38:16 +01:00
|
|
|
[ Convert.AlwaysKW.convert
|
2019-02-23 21:10:25 +01:00
|
|
|
, Convert.CaseKW.convert
|
2019-02-18 07:38:16 +01:00
|
|
|
, Convert.Logic.convert
|
2019-02-26 06:40:50 +01:00
|
|
|
, Convert.SplitPortDecl.convert
|
2019-02-18 07:38:16 +01:00
|
|
|
]
|
2019-02-18 05:39:01 +01:00
|
|
|
|
2019-02-28 20:06:35 +01:00
|
|
|
run :: Target -> Phase
|
2019-02-26 21:03:49 +01:00
|
|
|
run target = foldr (.) id $ phases target
|
2019-02-18 05:39:01 +01:00
|
|
|
|
2019-02-28 20:06:35 +01:00
|
|
|
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
|