Skip to content

Commit

Permalink
Don't prefix package name in _types package in VHDL
Browse files Browse the repository at this point in the history
Similar to ece7f26 for SystemVerilog, types should not appear
qualified in the package body for the types package in VHDL.

Fixes #1996.
  • Loading branch information
Alex McKenna committed Nov 11, 2021
1 parent c1264fd commit 940ec21
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 8 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
CHANGED: Types defined in the package head are no longer qualified in the package body when rendering VHDL [#1996](https://github.com/clash-lang/clash-compiler/issues/1996).
28 changes: 20 additions & 8 deletions clash-lib/src/Clash/Backend/VHDL.hs
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,8 @@ data VHDLState =
-- ^ Files to be stored: (filename, contents). These files are generated
-- during the execution of 'genNetlist'.
, _idSeen :: IdentifierSet
, _tyPkgCtx :: Bool
-- ^ Are we in the context of generating the @_types@ package?
, _intWidth :: Int
-- ^ Int/Word/Integer bit-width
, _hdlsyn :: HdlSyn
Expand Down Expand Up @@ -126,6 +128,7 @@ instance Backend VHDLState where
, _dataFiles=[]
, _memoryDataFiles=[]
, _idSeen=Id.emptyIdentifierSet esc lw VHDL
, _tyPkgCtx=False
, _intWidth=w
, _hdlsyn=hdlsyn_
, _undefValue=undefVal
Expand Down Expand Up @@ -184,7 +187,9 @@ instance Backend VHDLState where
Void {} -> pure PrimitiveType
KnownDomain {} -> pure PrimitiveType

hdlType Internal (filterTransparent -> ty) = sizedQualTyName ty
hdlType Internal (filterTransparent -> ty) = do
pkgCtx <- Ap (use tyPkgCtx)
if pkgCtx then sizedTyName ty else sizedQualTyName ty
hdlType (External nm) (filterTransparent -> ty) =
let sized = sizedQualTyName ty in
case ty of
Expand Down Expand Up @@ -390,15 +395,16 @@ genVHDL nm sp seen c = do
-- | Generate a VHDL package containing type definitions for the given HWTypes
mkTyPackage_ :: ModName -> [HWType] -> VHDLM [(String,Doc)]
mkTyPackage_ modName (map filterTransparent -> hwtys) = do
{ syn <- Ap hdlSyn
{ Ap (tyPkgCtx .= True)
; syn <- Ap hdlSyn
; enums <- Ap renderEnums
; let usedTys = concatMap mkUsedTys hwtys
; let normTys0 = nub (map mkVecZ (hwtys ++ usedTys))
; let sortedTys0 = topSortHWTys normTys0
packageDec = vcat $ mapM tyDec (nubBy eqTypM sortedTys0)
(funDecs,funBodies) = unzip . mapMaybe (funDec enums syn) $ nubBy eqTypM (normaliseType enums <$> sortedTys0)

; (:[]) <$> (TextS.unpack (modName `TextS.append` "_types"),) <$>
; pkg <- (:[]) <$> (TextS.unpack (modName `TextS.append` "_types"),) <$>
"library IEEE;" <> line <>
"use IEEE.STD_LOGIC_1164.ALL;" <> line <>
"use IEEE.NUMERIC_STD.ALL;" <> line <> line <>
Expand All @@ -407,6 +413,8 @@ mkTyPackage_ modName (map filterTransparent -> hwtys) = do
vcat (sequence funDecs)
) <> line <>
"end" <> semi <> packageBodyDec funBodies
; Ap (tyPkgCtx .= False)
; return pkg
}
where
packageBodyDec :: [VHDLM Doc] -> VHDLM Doc
Expand Down Expand Up @@ -682,13 +690,13 @@ funDec _ _ (Unsigned _) = Just
)

funDec _ _ t@(Product _ labels elTys) = Just
( "function" <+> "toSLV" <+> parens ("p :" <+> sizedQualTyName t) <+> "return std_logic_vector" <> semi <> line <>
"function" <+> "fromSLV" <+> parens ("slv" <+> colon <+> "in" <+> "std_logic_vector") <+> "return" <+> sizedQualTyName t <> semi
, "function" <+> "toSLV" <+> parens ("p :" <+> sizedQualTyName t) <+> "return std_logic_vector" <+> "is" <> line <>
( "function" <+> "toSLV" <+> parens ("p :" <+> sizedTyName t) <+> "return std_logic_vector" <> semi <> line <>
"function" <+> "fromSLV" <+> parens ("slv" <+> colon <+> "in" <+> "std_logic_vector") <+> "return" <+> sizedTyName t <> semi
, "function" <+> "toSLV" <+> parens ("p :" <+> sizedTyName t) <+> "return std_logic_vector" <+> "is" <> line <>
"begin" <> line <>
indent 2 ("return" <+> parens (hcat (punctuate " & " elTyToSLV)) <> semi) <> line <>
"end" <> semi <> line <>
"function" <+> "fromSLV" <+> parens ("slv" <+> colon <+> "in" <+> "std_logic_vector") <+> "return" <+> sizedQualTyName t <+> "is" <> line <>
"function" <+> "fromSLV" <+> parens ("slv" <+> colon <+> "in" <+> "std_logic_vector") <+> "return" <+> sizedTyName t <+> "is" <> line <>
"alias islv : std_logic_vector(0 to slv'length - 1) is slv;" <> line <>
"begin" <> line <>
indent 2 ("return" <+> parens (hcat (punctuate "," elTyFromSLV)) <> semi) <> line <>
Expand Down Expand Up @@ -1063,8 +1071,12 @@ qualTyName (filterTransparent -> hwty) = case hwty of

-- Custom types:
_ -> do
pkgCtx <- Ap (use tyPkgCtx)
modName <- Ap (use modNm)
pretty modName <> "_types." <> tyName hwty

if pkgCtx
then tyName hwty
else pretty modName <> "_types." <> tyName hwty

-- | Generates a unique name for a given type. This action will cache its
-- results, thus returning the same answer for the same @HWType@ argument.
Expand Down
1 change: 1 addition & 0 deletions tests/Main.hs
Original file line number Diff line number Diff line change
Expand Up @@ -548,6 +548,7 @@ runClashTest = defaultMain $ clashTestRoot
hdlTargets=[VHDL]
, expectClashFail=Just (NoTestExitCode, "NOT:WARNING")
}
, outputTest "T1996" def{hdlTargets=[VHDL]}
] <>
if compiledWith == Cabal then
-- This tests fails without environment files present, which are only
Expand Down

0 comments on commit 940ec21

Please sign in to comment.