@@ -18,6 +18,7 @@ module Clash.Class.NumConvert.Internal.MaybeNumConvert where
1818
1919import Clash.Class.BitPack
2020import Clash.Class.Resize
21+ import Clash.Promoted.Nat
2122import Clash.Sized.BitVector
2223import Clash.Sized.Index
2324import Clash.Sized.Signed
@@ -81,7 +82,10 @@ class MaybeNumConvert a b where
8182 maybeNumConvert :: a -> Maybe b
8283
8384instance (KnownNat n , KnownNat m ) => MaybeNumConvert (Index n ) (Index m ) where
84- maybeNumConvert ! a = maybeResize a
85+ maybeNumConvert ! a =
86+ case natToInteger @ m of
87+ 0 -> Nothing
88+ _ -> maybeResize a
8589
8690instance (KnownNat n , KnownNat m ) => MaybeNumConvert (Index n ) (Unsigned m ) where
8791 maybeNumConvert ! a = maybeResize $ bitCoerce @ _ @ (Unsigned (CLogWZ 2 n 0 )) a
@@ -93,7 +97,10 @@ instance (KnownNat n, KnownNat m) => MaybeNumConvert (Index n) (BitVector m) whe
9397 maybeNumConvert ! a = maybeResize $ pack a
9498
9599instance (KnownNat n , KnownNat m ) => MaybeNumConvert (Unsigned n ) (Index m ) where
96- maybeNumConvert ! a = maybeResize $ bitCoerce @ _ @ (Index (2 ^ n )) a
100+ maybeNumConvert ! a =
101+ case natToInteger @ m of
102+ 0 -> Nothing
103+ _ -> maybeResize $ bitCoerce @ _ @ (Index (2 ^ n )) a
97104
98105instance (KnownNat n , KnownNat m ) => MaybeNumConvert (Unsigned n ) (Unsigned m ) where
99106 maybeNumConvert ! a = maybeResize a
@@ -105,9 +112,11 @@ instance (KnownNat n, KnownNat m) => MaybeNumConvert (Unsigned n) (BitVector m)
105112 maybeNumConvert ! a = maybeResize $ pack a
106113
107114instance (KnownNat n , KnownNat m ) => MaybeNumConvert (Signed n ) (Index m ) where
108- maybeNumConvert n
109- | n < 0 = Nothing
110- | otherwise = maybeResize (bitCoerce @ _ @ (Index (2 ^ n )) (resize n))
115+ maybeNumConvert ! n =
116+ case natToInteger @ m of
117+ 0 -> Nothing
118+ _ | n < 0 -> Nothing
119+ | otherwise -> maybeResize (bitCoerce @ _ @ (Index (2 ^ n )) (resize n))
111120
112121instance (KnownNat n , KnownNat m ) => MaybeNumConvert (Signed n ) (Unsigned m ) where
113122 maybeNumConvert n
@@ -123,7 +132,10 @@ instance (KnownNat n, KnownNat m) => MaybeNumConvert (Signed n) (BitVector m) wh
123132 | otherwise = maybeResize (pack @ (Signed (n + 1 )) (extend n))
124133
125134instance (KnownNat n , KnownNat m ) => MaybeNumConvert (BitVector n ) (Index m ) where
126- maybeNumConvert ! a = maybeResize $ unpack @ (Index (2 ^ n )) a
135+ maybeNumConvert ! a =
136+ case natToInteger @ m of
137+ 0 -> Nothing
138+ _ -> maybeResize $ unpack @ (Index (2 ^ n )) a
127139
128140instance (KnownNat n , KnownNat m ) => MaybeNumConvert (BitVector n ) (Unsigned m ) where
129141 maybeNumConvert ! a = maybeResize $ unpack @ (Unsigned n ) a
0 commit comments