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

module Data.RiscV.Instruction.S where

import Clash.Explicit.Prelude.Safe

import Util

import Data.RiscV.Instruction

pattern S { major, minor, rs1, rs2, imm } <-
    (split -> ((split & \ (split -> (imm1 :: BitVector 7, blah), imm0 :: BitVector 5) -> (imm1 ++# imm0, blah)) ->
               (imm,
                split -> (split -> (Register -> rs1, Register -> rs2),
                          MinorOpcode -> minor)),
               split -> (0b11 :: BitVector 2, MajorOpcode -> major))) where
    S (MajorOpcode major) (MinorOpcode minor) (Register rs1) (Register rs2) (split -> (imm1, imm0)) =
        unpack $ imm1 ++# rs2 ++# rs1 ++# minor ++# (imm0 :: BitVector 5) ++# major ++# (0b11 :: BitVector 2)