summaryrefslogtreecommitdiff
path: root/src/Language/Fiddle/Ast
diff options
context:
space:
mode:
Diffstat (limited to 'src/Language/Fiddle/Ast')
-rw-r--r--src/Language/Fiddle/Ast/Internal/MetaTypes.hs32
-rw-r--r--src/Language/Fiddle/Ast/Internal/SyntaxTree.hs13
2 files changed, 44 insertions, 1 deletions
diff --git a/src/Language/Fiddle/Ast/Internal/MetaTypes.hs b/src/Language/Fiddle/Ast/Internal/MetaTypes.hs
index 2be212e..139637d 100644
--- a/src/Language/Fiddle/Ast/Internal/MetaTypes.hs
+++ b/src/Language/Fiddle/Ast/Internal/MetaTypes.hs
@@ -16,6 +16,14 @@ module Language.Fiddle.Ast.Internal.MetaTypes
Variant (..),
foldVariant,
toEither,
+ getLeft,
+ getRight,
+ progress,
+ progressBack,
+ progressM,
+ progressBackM,
+ changeLeft,
+ changeRight,
)
where
@@ -223,9 +231,33 @@ toEither :: Variant b t f -> Either t f
toEither (LeftV l) = Left l
toEither (RightV l) = Right l
+getLeft :: Variant True l r -> l
+getLeft (LeftV l) = l
+
+getRight :: Variant False l r -> r
+getRight (RightV r) = r
+
foldVariant :: (t -> r) -> (f -> r) -> Variant b t f -> r
foldVariant fl fr = either fl fr . toEither
+changeLeft :: Variant False l r -> Variant False l' r
+changeLeft (RightV r) = RightV r
+
+changeRight :: Variant True l r -> Variant True l r'
+changeRight (LeftV r) = LeftV r
+
+progressM :: (Functor m) => (l -> m r) -> Variant True l r -> m (Variant False l' r)
+progressM fn (LeftV l) = RightV <$> fn l
+
+progress :: (l -> r) -> Variant True l r -> Variant False l' r
+progress fn (LeftV l) = RightV (fn l)
+
+progressBack :: (r -> l) -> Variant False l r -> Variant True l r'
+progressBack fn (RightV r) = LeftV (fn r)
+
+progressBackM :: (Functor m) => (r -> m l) -> Variant False l r -> m (Variant True l r')
+progressBackM fn (RightV r) = LeftV <$> fn r
+
instance Functor (Variant b t) where
fmap _ (LeftV x) = LeftV x
fmap f (RightV x) = RightV (f x)
diff --git a/src/Language/Fiddle/Ast/Internal/SyntaxTree.hs b/src/Language/Fiddle/Ast/Internal/SyntaxTree.hs
index 0d0bc32..b597a25 100644
--- a/src/Language/Fiddle/Ast/Internal/SyntaxTree.hs
+++ b/src/Language/Fiddle/Ast/Internal/SyntaxTree.hs
@@ -18,6 +18,7 @@ module Language.Fiddle.Ast.Internal.SyntaxTree
FieldSpan (..),
QRegMetadata (..),
QBitsMetadata (..),
+ RegSz(..),
-- Witness Types
Witness (..),
-- AST Types
@@ -50,6 +51,7 @@ module Language.Fiddle.Ast.Internal.SyntaxTree
EnumConstantDecl (..),
PackageBody (..),
-- Helper Functions
+ regSzToBits,
mapDirected,
mapDirectedM,
asDirected,
@@ -105,6 +107,15 @@ deriving instance
(FromJSON (When s (FieldSpan Bytes))) =>
FromJSON (QRegMetadata s)
+data RegSz = RegSz8 | RegSz16 | RegSz32 | RegSz64
+ deriving (Eq, Ord, Show, Enum, Generic, ToJSON, FromJSON)
+
+regSzToBits :: RegSz -> N Bits
+regSzToBits RegSz8 = 8
+regSzToBits RegSz16 = 16
+regSzToBits RegSz32 = 32
+regSzToBits RegSz64 = 64
+
data QBitsMetadata (checkStage :: Bool) where
QBitsMetadata ::
{ bitsSpan :: When checkStage (FieldSpan Bits),
@@ -520,7 +531,7 @@ data ObjTypeDecl stage f a where
-- doesn't exist.
regIdent :: Guaranteed (stage .>= Qualified) (Identifier f a),
-- | Size of the register.
- regSize :: Expression Bits stage f a,
+ regSize :: Variant (stage .>= Qualified) RegSz (Expression Bits stage f a),
-- | Optional register body.
regBody :: Maybe (RegisterBody stage f a),
-- | Annotation for the register declaration.