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-03-08 17:02:40 +01:00
|
|
|
import qualified Job (Exclude(..))
|
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-04-04 01:08:30 +02:00
|
|
|
import qualified Convert.Assertion
|
2019-09-02 19:08:41 +02:00
|
|
|
import qualified Convert.BlockDecl
|
2019-09-14 22:42:54 +02:00
|
|
|
import qualified Convert.DimensionQuery
|
2019-08-29 02:28:56 +02:00
|
|
|
import qualified Convert.EmptyArgs
|
2019-03-01 04:44:31 +01:00
|
|
|
import qualified Convert.Enum
|
2019-08-30 06:11:57 +02:00
|
|
|
import qualified Convert.ForDecl
|
2019-09-15 21:49:21 +02:00
|
|
|
import qualified Convert.Foreach
|
2019-03-06 20:36:16 +01:00
|
|
|
import qualified Convert.FuncRet
|
2019-03-07 02:30:47 +01:00
|
|
|
import qualified Convert.Interface
|
2019-04-24 20:00:08 +02:00
|
|
|
import qualified Convert.IntTypes
|
2019-10-09 04:13:05 +02:00
|
|
|
import qualified Convert.Jump
|
2019-04-01 19:16:21 +02:00
|
|
|
import qualified Convert.KWArgs
|
2019-02-18 07:38:16 +01:00
|
|
|
import qualified Convert.Logic
|
2019-09-15 19:55:40 +02:00
|
|
|
import qualified Convert.LogOp
|
2019-09-27 04:47:36 +02:00
|
|
|
import qualified Convert.MultiplePacked
|
2019-04-20 01:08:52 +02:00
|
|
|
import qualified Convert.NamedBlock
|
2019-04-24 00:44:45 +02:00
|
|
|
import qualified Convert.NestPI
|
2019-04-24 02:22:03 +02:00
|
|
|
import qualified Convert.Package
|
2019-09-11 09:27:18 +02:00
|
|
|
import qualified Convert.ParamType
|
2019-08-29 01:48:25 +02:00
|
|
|
import qualified Convert.RemoveComments
|
2019-10-20 22:18:18 +02:00
|
|
|
import qualified Convert.SignCast
|
2019-09-12 04:52:01 +02:00
|
|
|
import qualified Convert.Simplify
|
2019-09-19 03:19:44 +02:00
|
|
|
import qualified Convert.SizeCast
|
2019-02-20 21:22:26 +01:00
|
|
|
import qualified Convert.StarPort
|
2019-03-27 02:43:27 +01:00
|
|
|
import qualified Convert.StmtBlock
|
2019-09-04 05:36:29 +02:00
|
|
|
import qualified Convert.Stream
|
2019-03-06 06:51:09 +01:00
|
|
|
import qualified Convert.Struct
|
2019-03-05 00:25:14 +01:00
|
|
|
import qualified Convert.Typedef
|
2019-03-19 18:40:25 +01:00
|
|
|
import qualified Convert.UnbasedUnsized
|
2019-03-05 00:25:14 +01:00
|
|
|
import qualified Convert.Unique
|
2019-09-27 04:47:36 +02:00
|
|
|
import qualified Convert.UnpackedArray
|
2019-09-25 05:35:06 +02:00
|
|
|
import qualified Convert.Unsigned
|
2019-02-18 05:39:01 +01:00
|
|
|
|
2019-04-24 00:44:45 +02:00
|
|
|
type Phase = [AST] -> [AST]
|
2019-02-18 05:39:01 +01:00
|
|
|
|
2019-03-08 17:02:40 +01:00
|
|
|
phases :: [Job.Exclude] -> [Phase]
|
|
|
|
|
phases excludes =
|
2019-03-05 01:58:54 +01:00
|
|
|
[ Convert.AsgnOp.convert
|
2019-04-20 01:08:52 +02:00
|
|
|
, Convert.NamedBlock.convert
|
2019-04-04 01:08:30 +02:00
|
|
|
, Convert.Assertion.convert
|
2019-09-02 19:08:41 +02:00
|
|
|
, Convert.BlockDecl.convert
|
2019-03-31 21:57:28 +02:00
|
|
|
, selectExclude (Job.Logic , Convert.Logic.convert)
|
2019-08-30 06:11:57 +02:00
|
|
|
, Convert.ForDecl.convert
|
2019-03-06 20:36:16 +01:00
|
|
|
, Convert.FuncRet.convert
|
2019-08-29 02:28:56 +02:00
|
|
|
, Convert.EmptyArgs.convert
|
2019-04-24 20:00:08 +02:00
|
|
|
, Convert.IntTypes.convert
|
2019-04-01 19:16:21 +02:00
|
|
|
, Convert.KWArgs.convert
|
2019-09-15 19:55:40 +02:00
|
|
|
, Convert.LogOp.convert
|
2019-09-27 04:47:36 +02:00
|
|
|
, Convert.MultiplePacked.convert
|
2019-09-14 22:42:54 +02:00
|
|
|
, Convert.DimensionQuery.convert
|
2019-09-11 09:27:18 +02:00
|
|
|
, Convert.ParamType.convert
|
2019-09-19 03:19:44 +02:00
|
|
|
, Convert.SizeCast.convert
|
2019-09-12 04:52:01 +02:00
|
|
|
, Convert.Simplify.convert
|
2019-02-26 21:03:49 +01:00
|
|
|
, Convert.StarPort.convert
|
2019-03-27 02:43:27 +01:00
|
|
|
, Convert.StmtBlock.convert
|
2019-09-04 05:36:29 +02:00
|
|
|
, Convert.Stream.convert
|
2019-03-06 06:51:09 +01:00
|
|
|
, Convert.Struct.convert
|
2019-03-01 04:44:31 +01:00
|
|
|
, Convert.Typedef.convert
|
2019-03-19 18:40:25 +01:00
|
|
|
, Convert.UnbasedUnsized.convert
|
2019-03-05 00:25:14 +01:00
|
|
|
, Convert.Unique.convert
|
2019-09-27 04:47:36 +02:00
|
|
|
, Convert.UnpackedArray.convert
|
2019-09-25 05:35:06 +02:00
|
|
|
, Convert.Unsigned.convert
|
2019-10-20 22:18:18 +02:00
|
|
|
, Convert.SignCast.convert
|
2019-04-24 02:22:03 +02:00
|
|
|
, Convert.Package.convert
|
2019-09-05 02:59:41 +02:00
|
|
|
, Convert.Enum.convert
|
2019-04-24 00:44:45 +02:00
|
|
|
, Convert.NestPI.convert
|
2019-10-09 04:13:05 +02:00
|
|
|
, Convert.Jump.convert
|
2019-09-15 21:49:21 +02:00
|
|
|
, Convert.Foreach.convert
|
2019-03-31 21:57:28 +02:00
|
|
|
, selectExclude (Job.Interface, Convert.Interface.convert)
|
|
|
|
|
, selectExclude (Job.Always , Convert.AlwaysKW.convert)
|
2019-08-29 01:48:25 +02:00
|
|
|
, selectExclude (Job.Succinct , Convert.RemoveComments.convert)
|
2019-03-31 21:57:28 +02:00
|
|
|
]
|
2019-03-08 17:02:40 +01:00
|
|
|
where
|
|
|
|
|
selectExclude :: (Job.Exclude, Phase) -> Phase
|
|
|
|
|
selectExclude (exclude, phase) =
|
|
|
|
|
if elem exclude excludes
|
|
|
|
|
then id
|
|
|
|
|
else phase
|
2019-02-18 05:39:01 +01:00
|
|
|
|
2019-03-08 17:02:40 +01:00
|
|
|
run :: [Job.Exclude] -> Phase
|
|
|
|
|
run excludes = foldr (.) id $ phases excludes
|
2019-02-18 05:39:01 +01:00
|
|
|
|
2019-03-08 17:02:40 +01:00
|
|
|
convert :: [Job.Exclude] -> Phase
|
|
|
|
|
convert excludes = convert'
|
2019-02-26 21:03:49 +01:00
|
|
|
where
|
|
|
|
|
convert' :: Phase
|
|
|
|
|
convert' descriptions =
|
|
|
|
|
if descriptions == descriptions'
|
|
|
|
|
then descriptions
|
|
|
|
|
else convert' descriptions'
|
2019-03-08 17:02:40 +01:00
|
|
|
where descriptions' = run excludes descriptions
|