diff --git a/src/Convert/DimensionQuery.hs b/src/Convert/DimensionQuery.hs index 6e637f8..ade09a8 100644 --- a/src/Convert/DimensionQuery.hs +++ b/src/Convert/DimensionQuery.hs @@ -25,11 +25,7 @@ import Convert.Traverse import Language.SystemVerilog.AST convert :: [AST] -> [AST] -convert files = - if files == files' - then files - else convert files' - where files' = map (traverseDescriptions convertDescription) files +convert = map $ traverseDescriptions convertDescription convertDescription :: Description -> Description convertDescription = diff --git a/src/Convert/NestPI.hs b/src/Convert/NestPI.hs index 9bb5a89..1bf984d 100644 --- a/src/Convert/NestPI.hs +++ b/src/Convert/NestPI.hs @@ -21,15 +21,9 @@ convert = map (filter (not . isPI)) . nest where nest :: [AST] -> [AST] - nest curr = - if next == curr - then curr - else nest next - where - next = traverseFiles - (collectDescriptionsM collectDescriptionM) - (traverseDescriptions . convertDescription) - curr + nest = traverseFiles + (collectDescriptionsM collectDescriptionM) + (traverseDescriptions . convertDescription) isPI :: Description -> Bool isPI (PackageItem Import{}) = False isPI (PackageItem item) = piName item /= Nothing @@ -46,7 +40,9 @@ collectDescriptionM _ = return () -- nests packages items missing from modules convertDescription :: PIs -> Description -> Description convertDescription pis (orig @ Part{}) = - Part attrs extern kw lifetime name ports items' + if Map.null pis + then orig + else Part attrs extern kw lifetime name ports items' where Part attrs extern kw lifetime name ports items = orig items' = addItems pis Set.empty items diff --git a/src/Convert/ParamType.hs b/src/Convert/ParamType.hs index c832ea0..c2fa02a 100644 --- a/src/Convert/ParamType.hs +++ b/src/Convert/ParamType.hs @@ -233,7 +233,7 @@ convertModuleItemM info (orig @ (Instance m bindings x r p)) = if Map.notMember m info then return orig else if Map.null maybeTypeMap then - return $ Instance m bindingsNamed x r p + return orig else if any (isLeft . snd) bindings' then error $ "param type resolution left type params: " ++ show orig ++ " converted to: " ++ show bindings' diff --git a/src/Language/SystemVerilog/AST/Expr.hs b/src/Language/SystemVerilog/AST/Expr.hs index 4422334..0e545f9 100644 --- a/src/Language/SystemVerilog/AST/Expr.hs +++ b/src/Language/SystemVerilog/AST/Expr.hs @@ -80,11 +80,6 @@ instance Show Expr where show (Repeat e l ) = printf "{%s {%s}}" (show e) (commas $ map show l) show (Concat l ) = printf "{%s}" (commas $ map show l) show (Stream o e l) = printf "{%s %s%s}" (show o) (show e) (show $ Concat l) - show (UniOp o e ) = printf "%s%s" (show o) (showUniOpPrec e) - show (BinOp o a b) = printf "%s %s %s" (showBinOpPrec a) (show o) (showBinOpPrec b) - show (Dot e n ) = printf "%s.%s" (show e) n - show (Mux c a b) = printf "(%s ? %s : %s)" (show c) (show a) (show b) - show (Call e l ) = printf "%s%s" (show e) (show l) show (Cast tore e ) = printf "%s'(%s)" (showEither tore) (show e) show (DimsFn f v ) = printf "%s(%s)" (show f) (showEither v) show (DimFn f v e) = printf "%s(%s, %s)" (show f) (showEither v) (show e) @@ -99,6 +94,37 @@ instance Show Expr where showPatternItem (':' : n, e) = showPatternItem (n, e) showPatternItem (n , e) = printf "%s: %s" n (show e) show (MinTypMax a b c) = printf "(%s : %s : %s)" (show a) (show b) (show c) + show (e @ UniOp{}) = showsPrec 0 e "" + show (e @ BinOp{}) = showsPrec 0 e "" + show (e @ Dot {}) = showsPrec 0 e "" + show (e @ Mux {}) = showsPrec 0 e "" + show (e @ Call {}) = showsPrec 0 e "" + + showsPrec _ (UniOp o e ) = + shows o . + showUniOpPrec e + showsPrec _ (BinOp o a b) = + showBinOpPrec a . + showChar ' ' . + shows o . + showChar ' ' . + showBinOpPrec b + showsPrec _ (Dot e n ) = + shows e . + showChar '.' . + showString n + showsPrec _ (Mux c a b) = + showChar '(' . + shows c . + showString " ? " . + shows a . + showString " : " . + shows b . + showChar ')' + showsPrec _ (Call e l ) = + shows e . + shows l + showsPrec _ e = \s -> show e ++ s data Args = Args [Maybe Expr] [(Identifier, Maybe Expr)] @@ -184,14 +210,14 @@ readNumber ('\'' : 'h' : rest) = _ -> Nothing readNumber n = readMaybe n -showUniOpPrec :: Expr -> String -showUniOpPrec (e @ UniOp{}) = printf "(%s)" (show e) -showUniOpPrec (e @ BinOp{}) = printf "(%s)" (show e) -showUniOpPrec e = show e +showUniOpPrec :: Expr -> ShowS +showUniOpPrec (e @ UniOp{}) = (showParen True . shows) e +showUniOpPrec (e @ BinOp{}) = (showParen True . shows) e +showUniOpPrec e = shows e -showBinOpPrec :: Expr -> String -showBinOpPrec (e @ BinOp{}) = printf "(%s)" (show e) -showBinOpPrec e = show e +showBinOpPrec :: Expr -> ShowS +showBinOpPrec (e @ BinOp{}) = (showParen True . shows) e +showBinOpPrec e = shows e -- basic expression simplfication utility to help us generate nicer code in the -- common case of ranges like `[FOO-1:0]` diff --git a/src/Language/SystemVerilog/AST/ShowHelp.hs b/src/Language/SystemVerilog/AST/ShowHelp.hs index 5fa255f..df35a0f 100644 --- a/src/Language/SystemVerilog/AST/ShowHelp.hs +++ b/src/Language/SystemVerilog/AST/ShowHelp.hs @@ -19,7 +19,7 @@ import Data.List (intercalate) showPad :: Show t => t -> String showPad x = - if str == "" + if null str then "" else str ++ " " where str = show x @@ -28,14 +28,14 @@ showPadBefore :: Show t => t -> String showPadBefore x = if str == "" then "" - else " " ++ str + else ' ' : str where str = show x indent :: String -> String -indent a = '\t' : f a +indent = (:) '\t' . f where f [] = [] - f ('\n' : xs) = "\n\t" ++ f xs + f ('\n' : xs) = '\n' : '\t' : f xs f (x : xs) = x : f xs unlines' :: [String] -> String @@ -46,7 +46,7 @@ commas = intercalate ", " indentedParenList :: [String] -> String indentedParenList [] = "()" -indentedParenList [x] = "(" ++ x ++ ")" +indentedParenList [x] = '(' : x ++ ")" indentedParenList l = "(\n" ++ (indent $ intercalate ",\n" l) ++ "\n)" showEither :: (Show a, Show b) => Either a b -> String