Commit a7673c55 by Zachary Snow

automatically fix simple declaration order issues

parent d2a0ba0d
...@@ -104,7 +104,8 @@ run :: [Job.Exclude] -> Phase ...@@ -104,7 +104,8 @@ run :: [Job.Exclude] -> Phase
run excludes = foldr (.) id $ phases excludes run excludes = foldr (.) id $ phases excludes
convert :: [Job.Exclude] -> Phase convert :: [Job.Exclude] -> Phase
convert excludes = convert' convert excludes =
convert' . Convert.NestPI.reorder
where where
convert' :: Phase convert' :: Phase
convert' descriptions = convert' descriptions =
......
...@@ -4,9 +4,10 @@ ...@@ -4,9 +4,10 @@
- Conversion for moving top-level package items into modules - Conversion for moving top-level package items into modules
-} -}
module Convert.NestPI (convert) where module Convert.NestPI (convert, reorder) where
import Control.Monad.Writer import Control.Monad.Writer
import Data.Maybe (mapMaybe)
import qualified Data.Map.Strict as Map import qualified Data.Map.Strict as Map
import qualified Data.Set as Set import qualified Data.Set as Set
...@@ -29,6 +30,9 @@ convert = ...@@ -29,6 +30,9 @@ convert =
isPI (PackageItem item) = piName item /= "" isPI (PackageItem item) = piName item /= ""
isPI _ = False isPI _ = False
reorder :: [AST] -> [AST]
reorder = map $ traverseDescriptions reorderDescription
-- collects packages items missing -- collects packages items missing
collectDescriptionM :: Description -> Writer PIs () collectDescriptionM :: Description -> Writer PIs ()
collectDescriptionM (PackageItem item) = do collectDescriptionM (PackageItem item) = do
...@@ -48,6 +52,18 @@ convertDescription pis (orig @ Part{}) = ...@@ -48,6 +52,18 @@ convertDescription pis (orig @ Part{}) =
items' = addItems pis Set.empty items items' = addItems pis Set.empty items
convertDescription _ other = other convertDescription _ other = other
-- attempt to fix simple declaration order issues
reorderDescription :: Description -> Description
reorderDescription (Part attrs extern kw lifetime name ports items) =
Part attrs extern kw lifetime name ports items'
where
items' = addItems localPIs Set.empty items
localPIs = Map.fromList $ mapMaybe toPIElem items
toPIElem :: ModuleItem -> Maybe (Identifier, PackageItem)
toPIElem (MIPackageItem item) = Just (piName item, item)
toPIElem _ = Nothing
reorderDescription other = other
-- iteratively inserts missing package items exactly where they are needed -- iteratively inserts missing package items exactly where they are needed
addItems :: PIs -> Idents -> [ModuleItem] -> [ModuleItem] addItems :: PIs -> Idents -> [ModuleItem] -> [ModuleItem]
addItems pis existingPIs (item : items) = addItems pis existingPIs (item : items) =
...@@ -66,7 +82,8 @@ addItems pis existingPIs (item : items) = ...@@ -66,7 +82,8 @@ addItems pis existingPIs (item : items) =
usedPIs = Set.unions $ map runner usedPIs = Set.unions $ map runner
[ collectStmtsM collectSubroutinesM [ collectStmtsM collectSubroutinesM
, collectTypesM $ collectNestedTypesM collectTypenamesM , collectTypesM $ collectNestedTypesM collectTypenamesM
, collectExprsM $ collectNestedExprsM collectIdentsM , collectExprsM $ collectNestedExprsM collectExprIdentsM
, collectLHSsM $ collectNestedLHSsM collectLHSIdentsM
] ]
neededPIs = Set.difference (Set.difference usedPIs existingPIs) thisPI neededPIs = Set.difference (Set.difference usedPIs existingPIs) thisPI
itemsToAdd = map MIPackageItem $ Map.elems $ itemsToAdd = map MIPackageItem $ Map.elems $
...@@ -87,10 +104,15 @@ collectSubroutinesM (Subroutine (Ident f) _) = tell $ Set.singleton f ...@@ -87,10 +104,15 @@ collectSubroutinesM (Subroutine (Ident f) _) = tell $ Set.singleton f
collectSubroutinesM _ = return () collectSubroutinesM _ = return ()
-- writes down the names of function calls and identifiers -- writes down the names of function calls and identifiers
collectIdentsM :: Expr -> Writer Idents () collectExprIdentsM :: Expr -> Writer Idents ()
collectIdentsM (Call (Ident x) _) = tell $ Set.singleton x collectExprIdentsM (Call (Ident x) _) = tell $ Set.singleton x
collectIdentsM (Ident x) = tell $ Set.singleton x collectExprIdentsM (Ident x) = tell $ Set.singleton x
collectIdentsM _ = return () collectExprIdentsM _ = return ()
-- writes down the names of identifiers
collectLHSIdentsM :: LHS -> Writer Idents ()
collectLHSIdentsM (LHSIdent x) = tell $ Set.singleton x
collectLHSIdentsM _ = return ()
-- writes down aliased typenames -- writes down aliased typenames
collectTypenamesM :: Type -> Writer Idents () collectTypenamesM :: Type -> Writer Idents ()
......
module top;
assign arr[0][0] = 1;
logic [1:0][2:0] arr;
initial $display("%b", arr);
endmodule
module top;
wire [5:0] arr;
assign arr[0] = 1;
initial $display("%b", arr);
endmodule
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment