Skip to content

Commit d7150eb

Browse files
committed
Render overflowed Index literals as errors
1 parent 1b40def commit d7150eb

File tree

4 files changed

+14
-5
lines changed

4 files changed

+14
-5
lines changed
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
FIXED: Clash hanging when rendering `Index n` literals, for large values of `n` [#2813](https://github.com/clash-lang/clash-compiler/issues/2813)
2+
FIXED: Render overflowed Index literals as errors

clash-lib/src/Clash/Backend/VHDL.hs

+4-1
Original file line numberDiff line numberDiff line change
@@ -1769,7 +1769,7 @@ expr_ _ (BlackBoxE pNm _ _ _ _ bbCtx _)
17691769
, [Literal _ (NumLit n), Literal _ i] <- extractLiterals bbCtx
17701770
, Just k <- clogBase 2 n
17711771
, let k' = max 1 k
1772-
= exprLit (Just (Unsigned k',k')) i
1772+
= exprLit (Just (Index n,k')) i
17731773

17741774
expr_ _ (BlackBoxE pNm _ _ _ _ bbCtx _)
17751775
| pNm == "Clash.Sized.Internal.Index.maxBound#"
@@ -1867,6 +1867,9 @@ exprLit (Just (hty,sz)) (NumLit i) = case hty of
18671867
| i < 0 -> "unsigned" <> parens ("std_logic_vector" <> parens ("to_signed" <> parens(integer i <> "," <> int n)))
18681868
| i < 2^(31 :: Integer) -> "to_unsigned" <> parens (integer i <> "," <> int n)
18691869
| otherwise -> "unsigned'" <> parens lit
1870+
Index n
1871+
| 0 <= i && i < n -> exprLit (Just (Unsigned sz, sz)) (NumLit i) -- reuse Unsigned implementation above
1872+
| otherwise -> hdlTypeErrValue hty
18701873
Signed n
18711874
| i < 2^(31 :: Integer) && i > (-2^(31 :: Integer)) -> "to_signed" <> parens (integer i <> "," <> int n)
18721875
| otherwise -> "signed'" <> parens lit

clash-lib/src/Clash/Backend/Verilog.hs

+4-2
Original file line numberDiff line numberDiff line change
@@ -1218,14 +1218,16 @@ rtreeChain _ = Nothing
12181218
exprLitV :: Maybe (HWType,Size) -> Literal -> VerilogM Doc
12191219
exprLitV = exprLit undefValue
12201220

1221-
exprLit :: Lens' s (Maybe (Maybe Int)) -> Maybe (HWType,Size) -> Literal -> Ap (State s) Doc
1221+
exprLit :: Backend s => Lens' s (Maybe (Maybe Int)) -> Maybe (HWType,Size) -> Literal -> Ap (State s) Doc
12221222
exprLit _ Nothing (NumLit i) = integer i
12231223

12241224
exprLit k (Just (hty,sz)) (NumLit i0) = case hty of
12251225
Unsigned _
12261226
| i < 0 -> string "-" <> int sz <> string "'d" <> integer (abs i)
12271227
| otherwise -> int sz <> string "'d" <> integer i
1228-
Index _ -> int (typeSize hty) <> string "'d" <> integer i
1228+
Index n
1229+
| 0 <= i0 && i0 < n -> int (typeSize hty) <> string "'d" <> integer i0
1230+
| otherwise -> hdlTypeErrValue hty
12291231
Signed _
12301232
| i < 0 -> string "-" <> int sz <> string "'sd" <> integer (abs i)
12311233
| otherwise -> int sz <> string "'sd" <> integer i

tests/shouldfail/Verification/SymbiYosys.hs

+5-2
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,13 @@ import Clash.Verification (RenderAs (YosysFormal), assert, checkI,
1313
topEntity :: Clock System -> Reset System -> Enable System -> Signal System (Bool, Bool, Bool)
1414
topEntity = exposeClockResetEnable go
1515

16-
go :: HiddenClockResetEnable dom => Signal dom (Bool, Bool, Bool)
16+
go :: forall dom. HiddenClockResetEnable dom => Signal dom (Bool, Bool, Bool)
1717
go =
1818
let -- oops, 'b' is never lit
19-
c = register (0 :: Index 15) (countSucc <$> c)
19+
cI :: Signal dom (Index 15)
20+
cI = register (0 :: Index 15) (countSucc <$> cI)
21+
c :: Signal dom (Unsigned 4)
22+
c = fmap bitCoerce cI
2023
r = (< 10) <$> c
2124
g = ((>= 10) .&&. (< 15)) <$> c
2225
b = (>= 15) <$> c

0 commit comments

Comments
 (0)