2019-02-18 05:39:01 +01:00
|
|
|
{- 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 ((>=>))
|
|
|
|
|
|
2019-02-18 05:39:01 +01:00
|
|
|
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
|
2021-02-03 22:12:05 +01:00
|
|
|
import qualified Convert.Cast
|
2019-09-14 22:42:54 +02:00
|
|
|
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
|
2019-08-29 02:28:56 +02:00
|
|
|
import qualified Convert.EmptyArgs
|
2019-03-01 04:44:31 +01:00
|
|
|
import qualified Convert.Enum
|
2022-04-12 01:44:47 +02:00
|
|
|
import qualified Convert.EventEdge
|
2022-03-12 23:57:17 +01:00
|
|
|
import qualified Convert.ExprAsgn
|
2021-07-14 21:50:12 +02:00
|
|
|
import qualified Convert.ForAsgn
|
2019-09-15 21:49:21 +02:00
|
|
|
import qualified Convert.Foreach
|
2019-03-06 20:36:16 +01:00
|
|
|
import qualified Convert.FuncRet
|
2020-01-12 03:06:09 +01:00
|
|
|
import qualified Convert.FuncRoutine
|
2021-02-10 18:43:59 +01:00
|
|
|
import qualified Convert.HierConst
|
2020-09-14 05:27:22 +02:00
|
|
|
import qualified Convert.ImplicitNet
|
2019-12-08 23:36:25 +01:00
|
|
|
import qualified Convert.Inside
|
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 02:22:03 +02:00
|
|
|
import qualified Convert.Package
|
2021-01-21 19:48:36 +01:00
|
|
|
import qualified Convert.ParamNoDefault
|
2019-09-11 09:27:18 +02:00
|
|
|
import qualified Convert.ParamType
|
2021-09-07 03:10:49 +02:00
|
|
|
import qualified Convert.PortDecl
|
2019-08-29 01:48:25 +02:00
|
|
|
import qualified Convert.RemoveComments
|
2021-04-30 19:42:36 +02:00
|
|
|
import qualified Convert.ResolveBindings
|
2019-09-12 04:52:01 +02:00
|
|
|
import qualified Convert.Simplify
|
2019-09-04 05:36:29 +02:00
|
|
|
import qualified Convert.Stream
|
2020-08-13 03:47:24 +02:00
|
|
|
import qualified Convert.StringParam
|
2019-03-06 06:51:09 +01:00
|
|
|
import qualified Convert.Struct
|
2020-05-06 01:32:37 +02:00
|
|
|
import qualified Convert.TFBlock
|
2019-03-05 00:25:14 +01:00
|
|
|
import qualified Convert.Typedef
|
2020-01-11 22:22:07 +01:00
|
|
|
import qualified Convert.TypeOf
|
2019-03-19 18:40:25 +01:00
|
|
|
import qualified Convert.UnbasedUnsized
|
2019-03-05 00:25:14 +01:00
|
|
|
import qualified Convert.Unique
|
2021-06-30 20:24:35 +02:00
|
|
|
import qualified Convert.UnnamedGenBlock
|
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-12-08 23:36:25 +01:00
|
|
|
import qualified Convert.Wildcard
|
2019-02-18 05:39:01 +01:00
|
|
|
|
2019-04-24 00:44:45 +02:00
|
|
|
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
|
2019-02-18 05:39:01 +01:00
|
|
|
|
2021-02-08 18:42:34 +01:00
|
|
|
finalPhases :: Selector -> [Phase]
|
|
|
|
|
finalPhases _ =
|
|
|
|
|
[ Convert.NamedBlock.convert
|
|
|
|
|
, Convert.DuplicateGenvar.convert
|
2021-07-16 03:37:44 +02:00
|
|
|
, Convert.AsgnOp.convert
|
2022-07-11 04:43:33 +02:00
|
|
|
, Convert.EmptyArgs.convert
|
2021-07-16 03:37:44 +02:00
|
|
|
, Convert.FuncRet.convert
|
|
|
|
|
, Convert.TFBlock.convert
|
2021-02-08 18:42:34 +01:00
|
|
|
]
|
|
|
|
|
|
|
|
|
|
mainPhases :: Selector -> [Phase]
|
|
|
|
|
mainPhases selectExclude =
|
2021-07-16 03:37:44 +02:00
|
|
|
[ Convert.BlockDecl.convert
|
2021-02-08 18:42:34 +01:00
|
|
|
, selectExclude Job.Logic Convert.Logic.convert
|
2020-09-14 05:27:22 +02:00
|
|
|
, Convert.ImplicitNet.convert
|
2019-12-08 23:36:25 +01:00
|
|
|
, Convert.Inside.convert
|
2019-04-24 20:00:08 +02:00
|
|
|
, Convert.IntTypes.convert
|
2019-09-27 04:47:36 +02:00
|
|
|
, Convert.MultiplePacked.convert
|
2021-10-03 23:00:59 +02:00
|
|
|
, selectExclude Job.UnbasedUnsized Convert.UnbasedUnsized.convert
|
2021-02-03 22:12:05 +01:00
|
|
|
, Convert.Cast.convert
|
2021-04-14 04:22:33 +02:00
|
|
|
, Convert.ParamType.convert
|
2021-02-10 18:43:59 +01:00
|
|
|
, Convert.HierConst.convert
|
2020-01-12 02:35:51 +01:00
|
|
|
, Convert.TypeOf.convert
|
2019-09-14 22:42:54 +02:00
|
|
|
, Convert.DimensionQuery.convert
|
2019-09-12 04:52:01 +02:00
|
|
|
, Convert.Simplify.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-09-27 04:47:36 +02:00
|
|
|
, Convert.UnpackedArray.convert
|
2019-09-25 05:35:06 +02:00
|
|
|
, Convert.Unsigned.convert
|
2019-12-08 23:36:25 +01:00
|
|
|
, Convert.Wildcard.convert
|
2019-09-05 02:59:41 +02:00
|
|
|
, Convert.Enum.convert
|
2020-08-13 03:47:24 +02:00
|
|
|
, 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
|
|
|
]
|
2019-02-18 05:39:01 +01:00
|
|
|
|
2021-02-08 18:42:34 +01:00
|
|
|
initialPhases :: Selector -> [Phase]
|
|
|
|
|
initialPhases selectExclude =
|
2021-07-16 03:37:44 +02:00
|
|
|
[ Convert.ForAsgn.convert
|
|
|
|
|
, Convert.Jump.convert
|
2022-03-12 23:57:17 +01:00
|
|
|
, Convert.ExprAsgn.convert
|
2021-07-16 03:37:44 +02:00
|
|
|
, Convert.KWArgs.convert
|
2021-02-08 18:42:34 +01:00
|
|
|
, Convert.Unique.convert
|
2022-04-12 01:44:47 +02:00
|
|
|
, 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
|
2021-07-16 03:37:44 +02:00
|
|
|
, Convert.FuncRoutine.convert
|
2021-02-08 18:42:34 +01:00
|
|
|
, selectExclude Job.Assert Convert.Assertion.convert
|
|
|
|
|
, selectExclude Job.Always Convert.AlwaysKW.convert
|
|
|
|
|
, Convert.Package.convert
|
2021-09-07 03:10:49 +02:00
|
|
|
, Convert.PortDecl.convert
|
2021-02-08 18:42:34 +01:00
|
|
|
, Convert.ParamNoDefault.convert
|
2021-04-30 19:42:36 +02:00
|
|
|
, Convert.ResolveBindings.convert
|
2021-06-30 20:24:35 +02:00
|
|
|
, Convert.UnnamedGenBlock.convert
|
2021-02-08 18:42:34 +01:00
|
|
|
]
|
2019-02-18 05:39:01 +01:00
|
|
|
|
2021-09-06 01:54:36 +02:00
|
|
|
convert :: FilePath -> [Job.Exclude] -> IOPhase
|
|
|
|
|
convert dumpPrefix excludes =
|
|
|
|
|
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 selectExclude
|
|
|
|
|
initial = combine $ initialPhases selectExclude
|
|
|
|
|
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
|