{-# LANGUAGE ViewPatterns, PatternSynonyms #-}
{-# LANGUAGE ScopedTypeVariables #-}

module Data.RiscV.Instruction.R where

import Clash.Explicit.Prelude.Safe

import Data.RiscV.Instruction

pattern R { major, rd, minor, rs1, rs2, func } <-
    (split -> (split -> (split -> (split -> (func :: BitVector 7,
                                             split -> (Register -> rs2, Register -> rs1)),
                                   MinorOpcode -> minor),
                         Register -> rd),
               split -> (0b11 :: BitVector 2, MajorOpcode -> major))) where
    R (MajorOpcode major) (Register rd) (MinorOpcode minor) (Register rs1) (Register rs2) func =
        unpack $ func ++# rs2 ++# rs1 ++# minor ++# rd ++# major ++# (0b11 :: BitVector 2)