{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE NoFieldSelectors #-}
module Clash.Shockwaves.Internal.Types where
import Clash.Prelude hiding (sub)
import Clash.Shockwaves.Internal.BitList (BitList)
import Data.Data (Typeable)
import qualified Data.List as L
import Data.Map as M
import Control.DeepSeq (NFData (rnf))
import Data.Aeson hiding (Value)
import Data.Char (digitToInt)
import Data.Colour.Names (readColourName)
import Data.Colour.SRGB (Colour, RGB (..), toSRGB24)
import Data.Maybe (fromJust)
import Data.String (IsString)
import Data.Word (Word8)
import GHC.Exts (IsString (fromString))
type TypeName = String
type SubSignal = String
type SignalName = SubSignal
type Value = String
type Prec = Integer
type Render = Maybe (Value, WaveStyle, Prec)
type LUTName = TypeName
type SignalMap = Map SignalName TypeName
type TypeMap = Map TypeName Translator
type LUTMap = Map LUTName LUT
type LUT = Map BitList Translation
type Color = RGB Word8
data Translation
= Translation Render [(SubSignal, Translation)]
deriving (Int -> Translation -> ShowS
[Translation] -> ShowS
Translation -> SubSignal
(Int -> Translation -> ShowS)
-> (Translation -> SubSignal)
-> ([Translation] -> ShowS)
-> Show Translation
forall a.
(Int -> a -> ShowS) -> (a -> SubSignal) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Translation -> ShowS
showsPrec :: Int -> Translation -> ShowS
$cshow :: Translation -> SubSignal
show :: Translation -> SubSignal
$cshowList :: [Translation] -> ShowS
showList :: [Translation] -> ShowS
Show, (forall x. Translation -> Rep Translation x)
-> (forall x. Rep Translation x -> Translation)
-> Generic Translation
forall x. Rep Translation x -> Translation
forall x. Translation -> Rep Translation x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Translation -> Rep Translation x
from :: forall x. Translation -> Rep Translation x
$cto :: forall x. Rep Translation x -> Translation
to :: forall x. Rep Translation x -> Translation
Generic, [Translation] -> Value
[Translation] -> Encoding
Translation -> Bool
Translation -> Value
Translation -> Encoding
(Translation -> Value)
-> (Translation -> Encoding)
-> ([Translation] -> Value)
-> ([Translation] -> Encoding)
-> (Translation -> Bool)
-> ToJSON Translation
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> (a -> Bool)
-> ToJSON a
$ctoJSON :: Translation -> Value
toJSON :: Translation -> Value
$ctoEncoding :: Translation -> Encoding
toEncoding :: Translation -> Encoding
$ctoJSONList :: [Translation] -> Value
toJSONList :: [Translation] -> Value
$ctoEncodingList :: [Translation] -> Encoding
toEncodingList :: [Translation] -> Encoding
$comitField :: Translation -> Bool
omitField :: Translation -> Bool
ToJSON, Translation -> ()
(Translation -> ()) -> NFData Translation
forall a. (a -> ()) -> NFData a
$crnf :: Translation -> ()
rnf :: Translation -> ()
NFData, Translation -> Translation -> Bool
(Translation -> Translation -> Bool)
-> (Translation -> Translation -> Bool) -> Eq Translation
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Translation -> Translation -> Bool
== :: Translation -> Translation -> Bool
$c/= :: Translation -> Translation -> Bool
/= :: Translation -> Translation -> Bool
Eq)
data WaveStyle
=
WSDefault
|
WSError
|
WSHidden
|
WSInherit Natural
|
WSNormal
|
WSWarn
|
WSUndef
|
WSHighImp
|
WSDontCare
|
WSWeak
|
WSColor Color
|
WSVar String WaveStyle
deriving (Int -> WaveStyle -> ShowS
[WaveStyle] -> ShowS
WaveStyle -> SubSignal
(Int -> WaveStyle -> ShowS)
-> (WaveStyle -> SubSignal)
-> ([WaveStyle] -> ShowS)
-> Show WaveStyle
forall a.
(Int -> a -> ShowS) -> (a -> SubSignal) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> WaveStyle -> ShowS
showsPrec :: Int -> WaveStyle -> ShowS
$cshow :: WaveStyle -> SubSignal
show :: WaveStyle -> SubSignal
$cshowList :: [WaveStyle] -> ShowS
showList :: [WaveStyle] -> ShowS
Show, (forall x. WaveStyle -> Rep WaveStyle x)
-> (forall x. Rep WaveStyle x -> WaveStyle) -> Generic WaveStyle
forall x. Rep WaveStyle x -> WaveStyle
forall x. WaveStyle -> Rep WaveStyle x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. WaveStyle -> Rep WaveStyle x
from :: forall x. WaveStyle -> Rep WaveStyle x
$cto :: forall x. Rep WaveStyle x -> WaveStyle
to :: forall x. Rep WaveStyle x -> WaveStyle
Generic, WaveStyle -> WaveStyle -> Bool
(WaveStyle -> WaveStyle -> Bool)
-> (WaveStyle -> WaveStyle -> Bool) -> Eq WaveStyle
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: WaveStyle -> WaveStyle -> Bool
== :: WaveStyle -> WaveStyle -> Bool
$c/= :: WaveStyle -> WaveStyle -> Bool
/= :: WaveStyle -> WaveStyle -> Bool
Eq)
instance NFData WaveStyle where
rnf :: WaveStyle -> ()
rnf !WaveStyle
_ = ()
data NumberFormat
=
NFSig
|
NFUns
|
NFHex
|
NFOct
|
NFBin
deriving (Int -> NumberFormat -> ShowS
[NumberFormat] -> ShowS
NumberFormat -> SubSignal
(Int -> NumberFormat -> ShowS)
-> (NumberFormat -> SubSignal)
-> ([NumberFormat] -> ShowS)
-> Show NumberFormat
forall a.
(Int -> a -> ShowS) -> (a -> SubSignal) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> NumberFormat -> ShowS
showsPrec :: Int -> NumberFormat -> ShowS
$cshow :: NumberFormat -> SubSignal
show :: NumberFormat -> SubSignal
$cshowList :: [NumberFormat] -> ShowS
showList :: [NumberFormat] -> ShowS
Show, Typeable, (forall x. NumberFormat -> Rep NumberFormat x)
-> (forall x. Rep NumberFormat x -> NumberFormat)
-> Generic NumberFormat
forall x. Rep NumberFormat x -> NumberFormat
forall x. NumberFormat -> Rep NumberFormat x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. NumberFormat -> Rep NumberFormat x
from :: forall x. NumberFormat -> Rep NumberFormat x
$cto :: forall x. Rep NumberFormat x -> NumberFormat
to :: forall x. Rep NumberFormat x -> NumberFormat
Generic, NumberFormat -> ()
(NumberFormat -> ()) -> NFData NumberFormat
forall a. (a -> ()) -> NFData a
$crnf :: NumberFormat -> ()
rnf :: NumberFormat -> ()
NFData)
type NumberSpacer = Maybe (Integer, String)
newtype Structure
= Structure [(SubSignal, Structure)]
deriving (Int -> Structure -> ShowS
[Structure] -> ShowS
Structure -> SubSignal
(Int -> Structure -> ShowS)
-> (Structure -> SubSignal)
-> ([Structure] -> ShowS)
-> Show Structure
forall a.
(Int -> a -> ShowS) -> (a -> SubSignal) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Structure -> ShowS
showsPrec :: Int -> Structure -> ShowS
$cshow :: Structure -> SubSignal
show :: Structure -> SubSignal
$cshowList :: [Structure] -> ShowS
showList :: [Structure] -> ShowS
Show, (forall x. Structure -> Rep Structure x)
-> (forall x. Rep Structure x -> Structure) -> Generic Structure
forall x. Rep Structure x -> Structure
forall x. Structure -> Rep Structure x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Structure -> Rep Structure x
from :: forall x. Structure -> Rep Structure x
$cto :: forall x. Rep Structure x -> Structure
to :: forall x. Rep Structure x -> Structure
Generic, [Structure] -> Value
[Structure] -> Encoding
Structure -> Bool
Structure -> Value
Structure -> Encoding
(Structure -> Value)
-> (Structure -> Encoding)
-> ([Structure] -> Value)
-> ([Structure] -> Encoding)
-> (Structure -> Bool)
-> ToJSON Structure
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> (a -> Bool)
-> ToJSON a
$ctoJSON :: Structure -> Value
toJSON :: Structure -> Value
$ctoEncoding :: Structure -> Encoding
toEncoding :: Structure -> Encoding
$ctoJSONList :: [Structure] -> Value
toJSONList :: [Structure] -> Value
$ctoEncodingList :: [Structure] -> Encoding
toEncodingList :: [Structure] -> Encoding
$comitField :: Structure -> Bool
omitField :: Structure -> Bool
ToJSON)
data Translator = Translator Int TranslatorVariant deriving (Int -> Translator -> ShowS
[Translator] -> ShowS
Translator -> SubSignal
(Int -> Translator -> ShowS)
-> (Translator -> SubSignal)
-> ([Translator] -> ShowS)
-> Show Translator
forall a.
(Int -> a -> ShowS) -> (a -> SubSignal) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Translator -> ShowS
showsPrec :: Int -> Translator -> ShowS
$cshow :: Translator -> SubSignal
show :: Translator -> SubSignal
$cshowList :: [Translator] -> ShowS
showList :: [Translator] -> ShowS
Show)
instance Show TypeRef where
show :: TypeRef -> SubSignal
show TypeRef
_ = SubSignal
"*"
data TypeRef = TypeRef
{ TypeRef -> Structure
structureRef :: Structure
, TypeRef -> BitList -> Translation
translateBinRef :: BitList -> Translation
, TypeRef -> Translator
translatorRef :: Translator
}
data TranslatorVariant
=
TRef TypeName TypeRef
|
TLut LUTName (Maybe LUT) TypeRef
|
TSum [Translator]
|
TAdvancedSum
{ TranslatorVariant -> Slice
index :: Slice
, TranslatorVariant -> Translator
defTrans :: Translator
, TranslatorVariant -> [(ISlice, Translator)]
rangeTrans :: [(ISlice, Translator)]
}
|
TProduct
{ TranslatorVariant -> [(SubSignal, Translator)]
subs :: [(SubSignal, Translator)]
, TranslatorVariant -> SubSignal
start :: Value
, TranslatorVariant -> SubSignal
sep :: Value
, TranslatorVariant -> SubSignal
stop :: Value
, TranslatorVariant -> [SubSignal]
labels :: [Value]
, TranslatorVariant -> Prec
preci :: Prec
, TranslatorVariant -> Prec
preco :: Prec
}
|
TArray
{ TranslatorVariant -> Translator
sub :: Translator
, TranslatorVariant -> Int
len :: Int
, start :: Value
, sep :: Value
, stop :: Value
, preci :: Prec
, preco :: Prec
}
|
TAdvancedProduct
{ TranslatorVariant -> [(Slice, Translator)]
sliceTrans :: [(Slice, Translator)]
, TranslatorVariant -> [(SubSignal, Int)]
hierarchy :: [(SubSignal, Int)]
, TranslatorVariant -> [ValuePart]
valueParts :: [ValuePart]
, preco :: Prec
}
|
TDuplicate SubSignal Translator
|
TStyled WaveStyle Translator
|
TChangeBits
{ TranslatorVariant -> BitPart
bits :: BitPart
, sub :: Translator
}
|
TNumber
{ TranslatorVariant -> NumberFormat
format :: NumberFormat
, TranslatorVariant -> NumberSpacer
spacer :: NumberSpacer
, TranslatorVariant -> SubSignal
prefix :: String
, TranslatorVariant -> Bool
warn :: Bool
}
|
TConst Translation
deriving (Int -> TranslatorVariant -> ShowS
[TranslatorVariant] -> ShowS
TranslatorVariant -> SubSignal
(Int -> TranslatorVariant -> ShowS)
-> (TranslatorVariant -> SubSignal)
-> ([TranslatorVariant] -> ShowS)
-> Show TranslatorVariant
forall a.
(Int -> a -> ShowS) -> (a -> SubSignal) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TranslatorVariant -> ShowS
showsPrec :: Int -> TranslatorVariant -> ShowS
$cshow :: TranslatorVariant -> SubSignal
show :: TranslatorVariant -> SubSignal
$cshowList :: [TranslatorVariant] -> ShowS
showList :: [TranslatorVariant] -> ShowS
Show)
data BitPart
=
BPIn
|
BPLit BitList
|
BPSlice Slice BitPart
|
BPConcat [BitPart]
|
BPHasUndefined BitPart
|
BPReverse BitPart
|
BPInvert BitPart
|
BPAnd [BitPart]
|
BPOr [BitPart]
|
BPXor [BitPart]
|
BPOneHot Slice BitPart
|
BPNHot Slice BitPart
|
BPIf BitPart BitPart BitPart BitPart
deriving (Int -> BitPart -> ShowS
[BitPart] -> ShowS
BitPart -> SubSignal
(Int -> BitPart -> ShowS)
-> (BitPart -> SubSignal) -> ([BitPart] -> ShowS) -> Show BitPart
forall a.
(Int -> a -> ShowS) -> (a -> SubSignal) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> BitPart -> ShowS
showsPrec :: Int -> BitPart -> ShowS
$cshow :: BitPart -> SubSignal
show :: BitPart -> SubSignal
$cshowList :: [BitPart] -> ShowS
showList :: [BitPart] -> ShowS
Show)
data ValuePart
=
VPLit String
|
VPRef Int Prec
deriving (Int -> ValuePart -> ShowS
[ValuePart] -> ShowS
ValuePart -> SubSignal
(Int -> ValuePart -> ShowS)
-> (ValuePart -> SubSignal)
-> ([ValuePart] -> ShowS)
-> Show ValuePart
forall a.
(Int -> a -> ShowS) -> (a -> SubSignal) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ValuePart -> ShowS
showsPrec :: Int -> ValuePart -> ShowS
$cshow :: ValuePart -> SubSignal
show :: ValuePart -> SubSignal
$cshowList :: [ValuePart] -> ShowS
showList :: [ValuePart] -> ShowS
Show)
type Slice = (Int, Int)
type ISlice = (Integer, Integer)
instance IsString WaveStyle where
fromString :: SubSignal -> WaveStyle
fromString (Char
'#' : SubSignal
hex) = Color -> WaveStyle
WSColor (Color -> WaveStyle) -> Color -> WaveStyle
forall a b. (a -> b) -> a -> b
$ [Word8] -> Color
go ([Word8] -> Color) -> [Word8] -> Color
forall a b. (a -> b) -> a -> b
$ (Char -> Word8) -> SubSignal -> [Word8]
forall a b. (a -> b) -> [a] -> [b]
L.map (Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Word8) -> (Char -> Int) -> Char -> Word8
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Int
digitToInt) SubSignal
hex
where
go :: [Word8] -> Color
go :: [Word8] -> Color
go [Word8
r, Word8
r', Word8
g, Word8
g', Word8
b, Word8
b'] = Word8 -> Word8 -> Word8 -> Color
forall a. a -> a -> a -> RGB a
RGB (Word8
16 Word8 -> Word8 -> Word8
forall a. Num a => a -> a -> a
* Word8
r Word8 -> Word8 -> Word8
forall a. Num a => a -> a -> a
+ Word8
r') (Word8
16 Word8 -> Word8 -> Word8
forall a. Num a => a -> a -> a
* Word8
g Word8 -> Word8 -> Word8
forall a. Num a => a -> a -> a
+ Word8
g') (Word8
16 Word8 -> Word8 -> Word8
forall a. Num a => a -> a -> a
* Word8
b Word8 -> Word8 -> Word8
forall a. Num a => a -> a -> a
+ Word8
b')
go [Word8
r, Word8
g, Word8
b] = Word8 -> Word8 -> Word8 -> Color
forall a. a -> a -> a -> RGB a
RGB (Word8
17 Word8 -> Word8 -> Word8
forall a. Num a => a -> a -> a
* Word8
r) (Word8
17 Word8 -> Word8 -> Word8
forall a. Num a => a -> a -> a
* Word8
g) (Word8
17 Word8 -> Word8 -> Word8
forall a. Num a => a -> a -> a
* Word8
b)
go [Word8]
_ = SubSignal -> Color
forall a. HasCallStack => SubSignal -> a
error (SubSignal
"bad hex code #" SubSignal -> ShowS
forall a. Semigroup a => a -> a -> a
<> SubSignal
hex)
fromString (Char
'$' : SubSignal
var) = SubSignal -> WaveStyle -> WaveStyle
WSVar SubSignal
var WaveStyle
WSDefault
fromString SubSignal
s =
Color -> WaveStyle
WSColor
(Color -> WaveStyle)
-> (Maybe (Colour Double) -> Color)
-> Maybe (Colour Double)
-> WaveStyle
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Colour Double -> Color
forall b. (RealFrac b, Floating b) => Colour b -> Color
toSRGB24
(Colour Double -> Color)
-> (Maybe (Colour Double) -> Colour Double)
-> Maybe (Colour Double)
-> Color
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe (Colour Double) -> Colour Double
forall a. HasCallStack => Maybe a -> a
fromJust
(Maybe (Colour Double) -> WaveStyle)
-> Maybe (Colour Double) -> WaveStyle
forall a b. (a -> b) -> a -> b
$ (SubSignal -> Maybe (Colour Double)
forall (m :: Type -> Type) a.
(MonadFail m, Monad m, Ord a, Floating a) =>
SubSignal -> m (Colour a)
readColourName SubSignal
s :: (Maybe (Colour Double)))
instance IsString ValuePart where
fromString :: SubSignal -> ValuePart
fromString = SubSignal -> ValuePart
VPLit
instance IsString BitPart where
fromString :: SubSignal -> BitPart
fromString SubSignal
s = BitList -> BitPart
BPLit (BitList -> BitPart) -> BitList -> BitPart
forall a b. (a -> b) -> a -> b
$ SubSignal -> BitList
forall a. IsString a => SubSignal -> a
fromString SubSignal
s
instance ToJSON BitPart where
toJSON :: BitPart -> Value
toJSON (BPConcat [BitPart]
bps) = [Pair] -> Value
object [Key
"C" Key -> [BitPart] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [BitPart]
bps]
toJSON (BPLit BitList
bl) = [Pair] -> Value
object [Key
"L" Key -> SubSignal -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= BitList -> SubSignal
forall a. Show a => a -> SubSignal
show BitList
bl]
toJSON (BPSlice Slice
s BitPart
a) = [Pair] -> Value
object [Key
"S" Key -> [Value] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [Slice -> Value
forall a. ToJSON a => a -> Value
toJSON Slice
s, BitPart -> Value
forall a. ToJSON a => a -> Value
toJSON BitPart
a]]
toJSON BitPart
BPIn = Value
"I"
toJSON (BPHasUndefined BitPart
a) = [Pair] -> Value
object [Key
"X" Key -> BitPart -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= BitPart
a]
toJSON (BPReverse BitPart
a) = [Pair] -> Value
object [Key
"R" Key -> BitPart -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= BitPart
a]
toJSON (BPInvert BitPart
a) = [Pair] -> Value
object [Key
"~" Key -> BitPart -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= BitPart
a]
toJSON (BPAnd [BitPart]
as) = [Pair] -> Value
object [Key
"&" Key -> [BitPart] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [BitPart]
as]
toJSON (BPOr [BitPart]
as) = [Pair] -> Value
object [Key
"|" Key -> [BitPart] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [BitPart]
as]
toJSON (BPXor [BitPart]
as) = [Pair] -> Value
object [Key
"^" Key -> [BitPart] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [BitPart]
as]
toJSON (BPOneHot Slice
s BitPart
i) = [Pair] -> Value
object [Key
"h" Key -> [Value] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [Slice -> Value
forall a. ToJSON a => a -> Value
toJSON Slice
s, BitPart -> Value
forall a. ToJSON a => a -> Value
toJSON BitPart
i]]
toJSON (BPNHot Slice
s BitPart
i) = [Pair] -> Value
object [Key
"H" Key -> [Value] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [Slice -> Value
forall a. ToJSON a => a -> Value
toJSON Slice
s, BitPart -> Value
forall a. ToJSON a => a -> Value
toJSON BitPart
i]]
toJSON (BPIf BitPart
t BitPart
f BitPart
x BitPart
c) = [Pair] -> Value
object [Key
"?" Key -> [BitPart] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [BitPart
t, BitPart
f, BitPart
x, BitPart
c]]
instance ToJSON ValuePart where
toJSON :: ValuePart -> Value
toJSON (VPLit SubSignal
s) = [Pair] -> Value
object [Key
"L" Key -> SubSignal -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= SubSignal
s]
toJSON (VPRef Int
i Prec
p) = [Pair] -> Value
object [Key
"R" Key -> [Value] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [Int -> Value
forall a. ToJSON a => a -> Value
toJSON Int
i, Prec -> Value
forall a. ToJSON a => a -> Value
toJSON Prec
p]]
instance ToJSON Translator where
toJSON :: Translator -> Value
toJSON (Translator Int
w TranslatorVariant
v) = [Pair] -> Value
object [Key
"w" Key -> Int -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Int
w, Key
"v" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Value
v']
where
v' :: Value
v' = case TranslatorVariant
v of
TRef SubSignal
n TypeRef
_ -> [Pair] -> Value
object [Key
"R" Key -> SubSignal -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= SubSignal
n]
TSum [Translator]
subs -> [Pair] -> Value
object [Key
"S" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [Translator] -> Value
forall a. ToJSON a => a -> Value
toJSON [Translator]
subs]
TAdvancedSum{Slice
index :: TranslatorVariant -> Slice
index :: Slice
index, Translator
defTrans :: TranslatorVariant -> Translator
defTrans :: Translator
defTrans, [(ISlice, Translator)]
rangeTrans :: TranslatorVariant -> [(ISlice, Translator)]
rangeTrans :: [(ISlice, Translator)]
rangeTrans} ->
[Pair] -> Value
object
[ Key
"S+"
Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [Pair] -> Value
object
[ Key
"i" Key -> Slice -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Slice
index
, Key
"d" Key -> Translator -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Translator
defTrans
, Key
"t" Key -> [(ISlice, Translator)] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [(ISlice, Translator)]
rangeTrans
]
]
TProduct{[(SubSignal, Translator)]
subs :: TranslatorVariant -> [(SubSignal, Translator)]
subs :: [(SubSignal, Translator)]
subs, SubSignal
start :: TranslatorVariant -> SubSignal
start :: SubSignal
start, SubSignal
sep :: TranslatorVariant -> SubSignal
sep :: SubSignal
sep, SubSignal
stop :: TranslatorVariant -> SubSignal
stop :: SubSignal
stop, [SubSignal]
labels :: TranslatorVariant -> [SubSignal]
labels :: [SubSignal]
labels, Prec
preci :: TranslatorVariant -> Prec
preci :: Prec
preci, Prec
preco :: TranslatorVariant -> Prec
preco :: Prec
preco} ->
[Pair] -> Value
object
[ Key
"P"
Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [Pair] -> Value
object
[ Key
"t" Key -> [(SubSignal, Translator)] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [(SubSignal, Translator)]
subs
, Key
"[" Key -> SubSignal -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= SubSignal
start
, Key
"," Key -> SubSignal -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= SubSignal
sep
, Key
"]" Key -> SubSignal -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= SubSignal
stop
, Key
"n" Key -> [SubSignal] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [SubSignal]
labels
, Key
"p" Key -> Prec -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Prec
preci
, Key
"P" Key -> Prec -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Prec
preco
]
]
TConst Translation
t -> [Pair] -> Value
object [Key
"C" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Translation -> Value
forall a. ToJSON a => a -> Value
toJSON Translation
t]
TLut SubSignal
lut Maybe LUT
_ TypeRef{Structure
structureRef :: TypeRef -> Structure
structureRef :: Structure
structureRef} -> [Pair] -> Value
object [Key
"L" Key -> [Value] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [SubSignal -> Value
forall a. ToJSON a => a -> Value
toJSON SubSignal
lut, Structure -> Value
forall a. ToJSON a => a -> Value
toJSON Structure
structureRef]]
TNumber{NumberFormat
format :: TranslatorVariant -> NumberFormat
format :: NumberFormat
format, NumberSpacer
spacer :: TranslatorVariant -> NumberSpacer
spacer :: NumberSpacer
spacer, SubSignal
prefix :: TranslatorVariant -> SubSignal
prefix :: SubSignal
prefix, Bool
warn :: TranslatorVariant -> Bool
warn :: Bool
warn} ->
[Pair] -> Value
object
[ Key
"N"
Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [Pair] -> Value
object
[ Key
"f" Key -> NumberFormat -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= NumberFormat
format
, Key
"s" Key -> NumberSpacer -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= NumberSpacer
spacer
, Key
"p" Key -> SubSignal -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= SubSignal
prefix
, Key
"w" Key -> Bool -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Bool
warn
]
]
TArray{Translator
sub :: TranslatorVariant -> Translator
sub :: Translator
sub, Int
len :: TranslatorVariant -> Int
len :: Int
len, SubSignal
start :: TranslatorVariant -> SubSignal
start :: SubSignal
start, SubSignal
sep :: TranslatorVariant -> SubSignal
sep :: SubSignal
sep, SubSignal
stop :: TranslatorVariant -> SubSignal
stop :: SubSignal
stop, Prec
preci :: TranslatorVariant -> Prec
preci :: Prec
preci, Prec
preco :: TranslatorVariant -> Prec
preco :: Prec
preco} ->
[Pair] -> Value
object
[ Key
"A"
Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [Pair] -> Value
object
[ Key
"t" Key -> Translator -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Translator
sub
, Key
"l" Key -> Int -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Int
len
, Key
"[" Key -> SubSignal -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= SubSignal
start
, Key
"," Key -> SubSignal -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= SubSignal
sep
, Key
"]" Key -> SubSignal -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= SubSignal
stop
, Key
"p" Key -> Prec -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Prec
preci
, Key
"P" Key -> Prec -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Prec
preco
]
]
TAdvancedProduct{[(Slice, Translator)]
sliceTrans :: TranslatorVariant -> [(Slice, Translator)]
sliceTrans :: [(Slice, Translator)]
sliceTrans, [(SubSignal, Int)]
hierarchy :: TranslatorVariant -> [(SubSignal, Int)]
hierarchy :: [(SubSignal, Int)]
hierarchy, [ValuePart]
valueParts :: TranslatorVariant -> [ValuePart]
valueParts :: [ValuePart]
valueParts, Prec
preco :: TranslatorVariant -> Prec
preco :: Prec
preco} ->
[Pair] -> Value
object
[ Key
"P+"
Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [Pair] -> Value
object
[ Key
"t" Key -> [(Slice, Translator)] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [(Slice, Translator)]
sliceTrans
, Key
"h" Key -> [(SubSignal, Int)] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [(SubSignal, Int)]
hierarchy
, Key
"v" Key -> [ValuePart] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [ValuePart]
valueParts
, Key
"P" Key -> Prec -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Prec
preco
]
]
TStyled WaveStyle
s Translator
t -> [Pair] -> Value
object [Key
"X" Key -> [Value] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [WaveStyle -> Value
forall a. ToJSON a => a -> Value
toJSON WaveStyle
s, Translator -> Value
forall a. ToJSON a => a -> Value
toJSON Translator
t]]
TDuplicate SubSignal
n Translator
t -> [Pair] -> Value
object [Key
"D" Key -> [Value] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [SubSignal -> Value
forall a. ToJSON a => a -> Value
toJSON SubSignal
n, Translator -> Value
forall a. ToJSON a => a -> Value
toJSON Translator
t]]
TChangeBits{Translator
sub :: TranslatorVariant -> Translator
sub :: Translator
sub, BitPart
bits :: TranslatorVariant -> BitPart
bits :: BitPart
bits} ->
[Pair] -> Value
object
[ Key
"B"
Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [Pair] -> Value
object
[ Key
"t" Key -> Translator -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Translator
sub
, Key
"b" Key -> BitPart -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= BitPart
bits
]
]
instance ToJSON WaveStyle where
toJSON :: WaveStyle -> Value
toJSON = \case
WaveStyle
WSDefault -> Value
"D"
WaveStyle
WSError -> Value
"E"
WaveStyle
WSHidden -> Value
"H"
WSInherit Natural
n -> [Pair] -> Value
object [Key
"I" Key -> Natural -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Natural
n]
WaveStyle
WSNormal -> Value
"N"
WaveStyle
WSWarn -> Value
"W"
WaveStyle
WSUndef -> Value
"U"
WaveStyle
WSHighImp -> Value
"Z"
WaveStyle
WSDontCare -> Value
"X"
WaveStyle
WSWeak -> Value
"Q"
WSColor (RGB Word8
r Word8
g Word8
b) -> [Pair] -> Value
object [Key
"C" Key -> [Word8] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [Word8
r, Word8
g, Word8
b, Word8
255]]
WSVar SubSignal
var WaveStyle
dflt -> [Pair] -> Value
object [Key
"V" Key -> [Value] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [SubSignal -> Value
forall a. ToJSON a => a -> Value
toJSON SubSignal
var, WaveStyle -> Value
forall a. ToJSON a => a -> Value
toJSON WaveStyle
dflt]]
instance ToJSON NumberFormat where
toJSON :: NumberFormat -> Value
toJSON = \case
NumberFormat
NFSig -> [Pair] -> Value
object [Key
"S" Key -> Prec -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Prec
6 :: Prec)]
NumberFormat
NFUns -> Value
"U"
NumberFormat
NFHex -> Value
"H"
NumberFormat
NFOct -> Value
"O"
NumberFormat
NFBin -> Value
"B"
mergeDuplicateSubsignals :: [(SubSignal, Structure)] -> [(SubSignal, Structure)]
mergeDuplicateSubsignals :: [(SubSignal, Structure)] -> [(SubSignal, Structure)]
mergeDuplicateSubsignals = [(SubSignal, Structure)] -> [(SubSignal, Structure)]
forall a. [a] -> [a]
L.reverse ([(SubSignal, Structure)] -> [(SubSignal, Structure)])
-> ([(SubSignal, Structure)] -> [(SubSignal, Structure)])
-> [(SubSignal, Structure)]
-> [(SubSignal, Structure)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((SubSignal, Structure)
-> [(SubSignal, Structure)] -> [(SubSignal, Structure)])
-> [(SubSignal, Structure)]
-> [(SubSignal, Structure)]
-> [(SubSignal, Structure)]
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: Type -> Type) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
L.foldr (SubSignal, Structure)
-> [(SubSignal, Structure)] -> [(SubSignal, Structure)]
addSignal [] ([(SubSignal, Structure)] -> [(SubSignal, Structure)])
-> ([(SubSignal, Structure)] -> [(SubSignal, Structure)])
-> [(SubSignal, Structure)]
-> [(SubSignal, Structure)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(SubSignal, Structure)] -> [(SubSignal, Structure)]
forall a. [a] -> [a]
L.reverse
where
addSignal ::
(SubSignal, Structure) -> [(SubSignal, Structure)] -> [(SubSignal, Structure)]
addSignal :: (SubSignal, Structure)
-> [(SubSignal, Structure)] -> [(SubSignal, Structure)]
addSignal (SubSignal, Structure)
sig [(SubSignal, Structure)]
signals = case (Maybe (SubSignal, Structure)
-> (SubSignal, Structure)
-> (Maybe (SubSignal, Structure), (SubSignal, Structure)))
-> Maybe (SubSignal, Structure)
-> [(SubSignal, Structure)]
-> (Maybe (SubSignal, Structure), [(SubSignal, Structure)])
forall (t :: Type -> Type) s a b.
Traversable t =>
(s -> a -> (s, b)) -> s -> t a -> (s, t b)
L.mapAccumL Maybe (SubSignal, Structure)
-> (SubSignal, Structure)
-> (Maybe (SubSignal, Structure), (SubSignal, Structure))
mergeOrPass ((SubSignal, Structure) -> Maybe (SubSignal, Structure)
forall a. a -> Maybe a
Just (SubSignal, Structure)
sig) [(SubSignal, Structure)]
signals of
(Maybe (SubSignal, Structure)
Nothing, [(SubSignal, Structure)]
signals') -> [(SubSignal, Structure)]
signals'
(Just (SubSignal, Structure)
sig', [(SubSignal, Structure)]
signals') -> (SubSignal, Structure)
sig' (SubSignal, Structure)
-> [(SubSignal, Structure)] -> [(SubSignal, Structure)]
forall a. a -> [a] -> [a]
: [(SubSignal, Structure)]
signals'
where
mergeOrPass ::
Maybe (SubSignal, Structure) ->
(SubSignal, Structure) ->
(Maybe (SubSignal, Structure), (SubSignal, Structure))
mergeOrPass :: Maybe (SubSignal, Structure)
-> (SubSignal, Structure)
-> (Maybe (SubSignal, Structure), (SubSignal, Structure))
mergeOrPass (Just (SubSignal
name, Structure [(SubSignal, Structure)]
s)) (SubSignal
name', Structure [(SubSignal, Structure)]
s')
| SubSignal
name SubSignal -> SubSignal -> Bool
forall a. Eq a => a -> a -> Bool
== SubSignal
name' =
(Maybe (SubSignal, Structure)
forall a. Maybe a
Nothing, (SubSignal
name, [(SubSignal, Structure)] -> Structure
Structure ([(SubSignal, Structure)] -> Structure)
-> [(SubSignal, Structure)] -> Structure
forall a b. (a -> b) -> a -> b
$ [(SubSignal, Structure)] -> [(SubSignal, Structure)]
mergeDuplicateSubsignals ([(SubSignal, Structure)]
s' [(SubSignal, Structure)]
-> [(SubSignal, Structure)] -> [(SubSignal, Structure)]
forall a. Semigroup a => a -> a -> a
<> [(SubSignal, Structure)]
s)))
mergeOrPass Maybe (SubSignal, Structure)
newsig (SubSignal, Structure)
oldsig = (Maybe (SubSignal, Structure)
newsig, (SubSignal, Structure)
oldsig)
instance Semigroup Structure where
<> :: Structure -> Structure -> Structure
(<>) (Structure [(SubSignal, Structure)]
a) (Structure [(SubSignal, Structure)]
b) = [(SubSignal, Structure)] -> Structure
Structure ([(SubSignal, Structure)] -> Structure)
-> [(SubSignal, Structure)] -> Structure
forall a b. (a -> b) -> a -> b
$ [(SubSignal, Structure)] -> [(SubSignal, Structure)]
mergeDuplicateSubsignals ([(SubSignal, Structure)] -> [(SubSignal, Structure)])
-> [(SubSignal, Structure)] -> [(SubSignal, Structure)]
forall a b. (a -> b) -> a -> b
$ [(SubSignal, Structure)]
a [(SubSignal, Structure)]
-> [(SubSignal, Structure)] -> [(SubSignal, Structure)]
forall a. Semigroup a => a -> a -> a
<> [(SubSignal, Structure)]
b