aboutsummaryrefslogtreecommitdiffstats
path: root/src/Verismith/Verilog/Parser.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Verismith/Verilog/Parser.hs')
-rw-r--r--src/Verismith/Verilog/Parser.hs34
1 files changed, 33 insertions, 1 deletions
diff --git a/src/Verismith/Verilog/Parser.hs b/src/Verismith/Verilog/Parser.hs
index 80996ba..a10fe22 100644
--- a/src/Verismith/Verilog/Parser.hs
+++ b/src/Verismith/Verilog/Parser.hs
@@ -32,6 +32,7 @@ import Data.Functor (($>))
import Data.Functor.Identity (Identity)
import Data.List (isInfixOf, isPrefixOf, null)
import Data.List.NonEmpty (NonEmpty (..))
+import qualified Data.Map.Strict as Map
import Data.Text (Text)
import qualified Data.Text as T
import qualified Data.Text.IO as T
@@ -521,6 +522,37 @@ parseModDecl = do
modItem
paramList
+mergeMaybe :: Maybe a -> Maybe a -> Maybe a
+mergeMaybe (Just a) Nothing = Just a
+mergeMaybe Nothing (Just a) = Just a
+mergeMaybe a _ = a
+
+mergeType :: PortType -> PortType -> PortType
+mergeType Reg Wire = Reg
+mergeType Wire Reg = Reg
+mergeType a _ = a
+
+mergePorts :: Port -> Port -> Port
+mergePorts (Port t1 s1 r1 n1) (Port t2 s2 r2 n2) =
+ Port (mergeType t1 t2) (s1 || s2) (if r1 == 0 then r2 else r1) n1
+
+mergeIO :: ModItem a -> ModItem a -> ModItem a
+mergeIO (Decl a1 b1 c1) (Decl a2 b2 c2) = Decl (mergeMaybe a1 a2) (mergePorts b1 b2) (mergeMaybe c1 c2)
+mergeIO a _ = a
+
+genmoditem :: Map.Map Identifier (ModItem a) -> ModItem a -> Map.Map Identifier (ModItem a)
+genmoditem m (Decl a b c) =
+ Map.insertWith mergeIO (b^.portName) (Decl a b c) m
+genmoditem m b = m
+
+modifyelements :: [ModItem a] -> [ModItem a]
+modifyelements ma = ndecl <> nodecl
+ where
+ ndecl = Map.elems $ foldl genmoditem Map.empty ma
+ isDecl Decl{} = True
+ isDecl _ = False
+ nodecl = filter isDecl ma
+
-- | Parses a 'String' into 'Verilog' by skipping any beginning whitespace
-- and then parsing multiple Verilog source.
parseVerilogSrc :: Parser (Verilog ann)
@@ -537,7 +569,7 @@ parseVerilog ::
-- message if parse fails.
Either Text (Verilog ann)
parseVerilog s =
- bimap showT id
+ bimap showT id --(_Wrapped.traverse.modItems %~ modifyelements)
. parse parseVerilogSrc (T.unpack s)
. alexScanTokens
. preprocess [] (T.unpack s)