clash-prelude-0.11: src/CLaSH/Class/Resize.hs
{-|
Copyright : (C) 2013-2016, University of Twente
License : BSD2 (see the file LICENSE)
Maintainer : Christiaan Baaij <christiaan.baaij@gmail.com>
-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE Safe #-}
{-# OPTIONS_GHC -fplugin GHC.TypeLits.KnownNat.Solver #-}
{-# OPTIONS_HADDOCK show-extensions #-}
module CLaSH.Class.Resize where
import GHC.TypeLits (Nat, KnownNat, type (+))
-- | Coerce a value to be represented by a different number of bits
class Resize (f :: Nat -> *) where
-- | A sign-preserving resize operation
--
-- * For signed datatypes: Increasing the size of the number replicates the
-- sign bit to the left. Truncating a number to length L keeps the sign bit
-- and the rightmost L-1 bits.
--
-- * For unsigned datatypes: Increasing the size of the number extends with
-- zeros to the left. Truncating a number of length N to a length L just
-- removes the left (most significant) N-L bits.
resize :: (KnownNat a, KnownNat b) => f a -> f b
-- | Perform a 'zeroExtend' for unsigned datatypes, and 'signExtend' for a
-- signed datatypes
extend :: (KnownNat a, KnownNat b) => f a -> f (b + a)
extend = resize
-- | Add extra zero bits in front of the MSB
zeroExtend :: (KnownNat a, KnownNat b) => f a -> f (b + a)
-- | Add extra sign bits in front of the MSB
signExtend :: (KnownNat a, KnownNat b) => f a -> f (b + a)
signExtend = resize
-- | Remove bits from the MSB
truncateB :: KnownNat a => f (a + b) -> f a