This commit is contained in:
Quentin Corradi 2024-11-04 18:57:12 +08:00 committed by GitHub
commit 00ee892109
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 19 additions and 7 deletions

View File

@ -17,7 +17,7 @@ import Language.SystemVerilog.AST.ShowHelp
import Language.SystemVerilog.AST.Expr (Expr)
import Language.SystemVerilog.AST.Op (AsgnOp)
import Language.SystemVerilog.AST.Type (Identifier)
import {-# SOURCE #-} Language.SystemVerilog.AST.ModuleItem (ModuleItem)
import {-# SOURCE #-} Language.SystemVerilog.AST.ModuleItem (ModuleItem, showGenModuleItem)
data GenItem
= GenBlock Identifier [GenItem]
@ -36,21 +36,23 @@ instance Show GenItem where
printf "case (%s)\n%s\nendcase" (show e) bodyStr
where bodyStr = indent $ unlines' $ map showGenCase cs
show (GenIf e a GenNull) = printf "if (%s) %s" (show e) (showBareBlock a)
-- showBlockedBranch avoids dangling else ambiguity
show (GenIf e a b ) = printf "if (%s) %s\nelse %s" (show e) (showBlockedBranch a) (showBareBlock b)
show (GenFor (x1, e1) c (x2, o2, e2) s) =
printf "for (%s = %s; %s; %s %s %s) %s"
x1 (show e1)
(show c)
x2 (show o2) (show e2)
(showBareBlock s)
show (GenNull) = ";"
show (GenModuleItem item) = show item
(showBlockedBranch s) -- Verilog 2001 requires this to be a block
show (GenNull) = ""
show (GenModuleItem item) = showGenModuleItem item
showBareBlock :: GenItem -> String
showBareBlock (GenBlock x i) =
printf "begin%s\n%s\nend"
(if null x then "" else " : " ++ x)
(indent $ show i)
showBareBlock (GenNull) = ";"
showBareBlock item = show item
showBlockedBranch :: GenItem -> String

View File

@ -14,6 +14,7 @@ module Language.SystemVerilog.AST.ModuleItem
, NOutputGateKW (..)
, AssignOption (..)
, AssertionItem (..)
, showGenModuleItem
) where
import Data.List (intercalate)
@ -94,6 +95,10 @@ showModportDecl (dir, ident, e) =
then printf "%s %s" (show dir) ident
else printf "%s .%s(%s)" (show dir) ident (show e)
showGenModuleItem :: ModuleItem -> String
showGenModuleItem (Generate genItems) = show genItems
showGenModuleItem item = show item
type PortBinding = (Identifier, Expr)
type ModportDecl = (Direction, Identifier, Expr)

View File

@ -1,7 +1,10 @@
module Language.SystemVerilog.AST.ModuleItem
( ModuleItem
, showGenModuleItem
) where
data ModuleItem
instance Eq ModuleItem
instance Show ModuleItem
showGenModuleItem :: ModuleItem -> String

View File

@ -705,7 +705,11 @@ ModuleItem :: { [ModuleItem] }
: NonGenerateModuleItem { $1 }
| ConditionalGenerateConstruct { [Generate [$1]] }
| LoopGenerateConstruct { [Generate [$1]] }
| AttributeInstance ModuleItem { map (addMIAttr $1) $2 }
| "generate" GenItems endgenerate { [Generate $2] }
NonGenerateModuleItemA :: { [ModuleItem] }
: NonGenerateModuleItem { $1 }
| AttributeInstance NonGenerateModuleItemA { map (addMIAttr $1) $2 }
NonGenerateModuleItem :: { [ModuleItem] }
-- This item covers module instantiations and all declarations
: ModuleDeclTokens(";") {% mapM recordPartUsed $ parseDTsAsModuleItems $1 }
@ -721,7 +725,6 @@ NonGenerateModuleItem :: { [ModuleItem] }
| TaskOrFunction { [MIPackageItem $1] }
| NInputGateKW NInputGates ";" { map (\(a, b, c, d) -> NInputGate $1 a b c d) $2 }
| NOutputGateKW NOutputGates ";" { map (\(a, b, c, d) -> NOutputGate $1 a b c d) $2 }
| AttributeInstance ModuleItem { map (addMIAttr $1) $2 }
| AssertionItem { [AssertionItem $1] }
AssignOption :: { AssignOption }
@ -1469,8 +1472,7 @@ GenItems :: { [GenItem] }
GenItem :: { GenItem }
: MITrace GenBlock { uncurry GenBlock $2 }
| MITrace NonGenerateModuleItem { genItemsToGenItem $ map GenModuleItem $ addMITrace $1 $2 }
| MITrace "generate" GenItems "endgenerate" { genItemsToGenItem $3 }
| MITrace NonGenerateModuleItemA { genItemsToGenItem $ map GenModuleItem $ addMITrace $1 $2 }
| MITrace ConditionalGenerateConstruct { $2 }
| MITrace LoopGenerateConstruct { $2 }
ConditionalGenerateConstruct :: { GenItem }