Skip to content

Commit

Permalink
Simplify (un)concatBitVector# implementations
Browse files Browse the repository at this point in the history
  • Loading branch information
christiaanb committed Sep 15, 2017
1 parent 1a23fe5 commit 4fb8f78
Showing 1 changed file with 17 additions and 21 deletions.
38 changes: 17 additions & 21 deletions src/CLaSH/Sized/Vector.hs
Expand Up @@ -1932,31 +1932,27 @@ instance (KnownNat n, KnownNat (BitSize a), BitPack a) => BitPack (Vec n a) wher
pack = concatBitVector# . map pack
unpack = map unpack . unconcatBitVector#

concatBitVector# :: KnownNat m
=> Vec n (BitVector m)
-> BitVector (n * m)
concatBitVector# = concatBitVector' . reverse
where
concatBitVector' :: KnownNat m
=> Vec n (BitVector m)
-> BitVector (n * m)
concatBitVector' Nil = 0
concatBitVector' (x `Cons` xs) = concatBitVector' xs ++# x
concatBitVector#
:: (KnownNat n, KnownNat m)
=> Vec n (BitVector m)
-> BitVector (n * m)
concatBitVector# Nil = 0
concatBitVector# (x `Cons` xs) = x ++# concatBitVector# xs
{-# NOINLINE concatBitVector# #-}

unconcatBitVector# :: (KnownNat n, KnownNat m)
=> BitVector (n * m)
-> Vec n (BitVector m)
unconcatBitVector# bv = withSNat (\s -> ucBV (toUNat s) bv)
unconcatBitVector#
:: forall n m
. (KnownNat n, KnownNat m)
=> BitVector (n * m)
-> Vec n (BitVector m)
unconcatBitVector# = go (toUNat (SNat @ n))
where
go :: KnownNat x => UNat x -> BitVector (x * m) -> Vec x (BitVector m)
go UZero _ = Nil
go (USucc n) bv = let (x :: BitVector m,bv') = split# bv
in x :> go n bv'
{-# NOINLINE unconcatBitVector# #-}

ucBV :: forall n m . KnownNat m
=> UNat n -> BitVector (n * m) -> Vec n (BitVector m)
ucBV UZero _ = Nil
ucBV (USucc n) bv = let (bv',x :: BitVector m) = split# bv
in ucBV n bv' :< x
{-# INLINE ucBV #-}

-- | Convert a 'BitVector' to a 'Vec' of 'Bit's.
--
-- >>> let x = 6 :: BitVector 8
Expand Down

0 comments on commit 4fb8f78

Please sign in to comment.