packages feed

keelung-0.9.0.0: src/Keelung/Data/BinRep.hs

{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# OPTIONS_HADDOCK hide #-}

module Keelung.Data.BinRep where

import Control.DeepSeq (NFData)
import Data.Serialize (Serialize)
import GHC.Generics (Generic)
import Keelung.Syntax (Var)

--------------------------------------------------------------------------------

-- | Relation between a variable and binary representation
--   $var = bit₀ + 2bit₁ + 4bit₂ + 8bit₃ + ... + 2^(n-1)bitₙ
data BinRep = BinRep
  { -- | The variable
    binRepVar :: Var,
    -- | Total number of bits
    binRepWidth :: Int,
    -- | The starting index of the bits
    binRepBitStart :: Var
  }
  deriving (Eq, Generic, NFData)

instance Serialize BinRep

instance Show BinRep where
  show (BinRep var 1 index) = "$" <> show var <> " = $" <> show index
  show (BinRep var 2 index) = "$" <> show var <> " = $" <> show index <> " + 2$" <> show (index + 1)
  show (BinRep var 3 index) = "$" <> show var <> " = $" <> show index <> " + 2$" <> show (index + 1) <> " + 4$" <> show (index + 2)
  show (BinRep var 4 index) = "$" <> show var <> " = $" <> show index <> " + 2$" <> show (index + 1) <> " + 4$" <> show (index + 2) <> " + 8$" <> show (index + 3)
  show (BinRep var w index) = "$" <> show var <> " = $" <> show index <> " + 2$" <> show (index + 1) <> " + ... + 2^" <> show (w - 1) <> "$" <> show (index + w - 1)

instance Ord BinRep where
  compare (BinRep x _ _) (BinRep y _ _) = compare x y